From 08f9a211256668ae6b897d923be647c2abce7ff7 Mon Sep 17 00:00:00 2001 From: Ammar Ahmed Date: Sun, 2 Nov 2025 23:15:24 +0500 Subject: [PATCH 1/2] add benchmarks --- test-app/app/src/main/AndroidManifest.xml | 1 + .../app/src/main/assets/app/MyActivity.js | 19 +- test-app/app/src/main/assets/app/benchmark.js | 16229 ++++++++++++++++ .../src/main/assets/internal/ts_helpers.js | 4 +- 4 files changed, 16250 insertions(+), 3 deletions(-) create mode 100644 test-app/app/src/main/assets/app/benchmark.js diff --git a/test-app/app/src/main/AndroidManifest.xml b/test-app/app/src/main/AndroidManifest.xml index b0a7d50b..bd80c3ae 100644 --- a/test-app/app/src/main/AndroidManifest.xml +++ b/test-app/app/src/main/AndroidManifest.xml @@ -26,6 +26,7 @@ android:name="com.tns.ErrorReportActivity" android:label="ErrorActivity"> + \ No newline at end of file diff --git a/test-app/app/src/main/assets/app/MyActivity.js b/test-app/app/src/main/assets/app/MyActivity.js index 3f2f9963..3ff34f5b 100644 --- a/test-app/app/src/main/assets/app/MyActivity.js +++ b/test-app/app/src/main/assets/app/MyActivity.js @@ -21,6 +21,7 @@ } } */ +const benchmarkRunner = require("./benchmark.js"); var MyActivity = (function (_super) { __extends(MyActivity, _super); function MyActivity() { @@ -30,18 +31,23 @@ var MyActivity = (function (_super) { _super.prototype.onCreate.call(this, bundle); require('./tests/testsWithContext').run(this); //run jasmine - execute(); +// execute(); var layout = new android.widget.LinearLayout(this); layout.setOrientation(1); this.setContentView(layout); var textView = new android.widget.TextView(this); textView.setText("It's a button!"); + textView.setTextIsSelectable(true); layout.addView(textView); var button = new android.widget.Button(this); button.setText("Hit me"); layout.addView(button); + var button2 = new android.widget.Button(this); + button2.setText("Run Benchmark"); + layout.addView(button2); + var Color = android.graphics.Color; var colors = [ Color.BLUE, @@ -62,6 +68,17 @@ var MyActivity = (function (_super) { }, }) ); + button2.setOnClickListener( + new android.view.View.OnClickListener("AppClickListener", { + onClick: function () { + const result = benchmarkRunner.runBenchmark(); + setTimeout(() => { + globalThis.gc(); + }); + textView.setText(result); + }, + }) + ); }; MyActivity = __decorate( [JavaProxy("com.tns.NativeScriptActivity")], diff --git a/test-app/app/src/main/assets/app/benchmark.js b/test-app/app/src/main/assets/app/benchmark.js new file mode 100644 index 00000000..6ab054b3 --- /dev/null +++ b/test-app/app/src/main/assets/app/benchmark.js @@ -0,0 +1,16229 @@ +'use strict' +'use strip' +// Copyright 2012 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Simple framework for running the benchmark suites and +// computing a score based on the timing measurements. + +// A benchmark has a name (string) and a function that will be run to +// do the performance measurement. The optional setup and tearDown +// arguments are functions that will be invoked before and after +// running the benchmark, but the running time of these functions will +// not be accounted for in the benchmark score. +function Benchmark(name, run, setup, tearDown) { + this.name = name + this.run = run + this.Setup = setup ? setup : function () {} + this.TearDown = tearDown ? tearDown : function () {} +} + +// Benchmark results hold the benchmark and the measured time used to +// run the benchmark. The benchmark score is computed later once a +// full benchmark suite has run to completion. +function BenchmarkResult(benchmark, time) { + this.benchmark = benchmark + this.time = time +} + +// Automatically convert results to numbers. Used by the geometric +// mean computation. +BenchmarkResult.prototype.valueOf = function () { + return this.time +} + +// Suites of benchmarks consist of a name and the set of benchmarks in +// addition to the reference timing that the final score will be based +// on. This way, all scores are relative to a reference run and higher +// scores implies better performance. +function BenchmarkSuite(name, reference, benchmarks) { + this.name = name + this.reference = reference + this.benchmarks = benchmarks + BenchmarkSuite.suites.push(this) +} + +// Keep track of all declared benchmark suites. +BenchmarkSuite.suites = [] + +// Scores are not comparable across versions. Bump the version if +// you're making changes that will affect that scores, e.g. if you add +// a new benchmark or change an existing one. +BenchmarkSuite.version = '7' + +// To make the benchmark results predictable, we replace Math.random +// with a 100% deterministic alternative. +Math.random = (function () { + var seed = 49734321 + return function () { + // Robert Jenkins' 32 bit integer hash function. + seed = (seed + 0x7ed55d16 + (seed << 12)) & 0xffffffff + seed = (seed ^ 0xc761c23c ^ (seed >>> 19)) & 0xffffffff + seed = (seed + 0x165667b1 + (seed << 5)) & 0xffffffff + seed = ((seed + 0xd3a2646c) ^ (seed << 9)) & 0xffffffff + seed = (seed + 0xfd7046c5 + (seed << 3)) & 0xffffffff + seed = (seed ^ 0xb55a4f09 ^ (seed >>> 16)) & 0xffffffff + return (seed & 0xfffffff) / 0x10000000 + } +})() + +// Runs all registered benchmark suites and optionally yields between +// each individual benchmark to avoid running for too long in the +// context of browsers. Once done, the final score is reported to the +// runner. +BenchmarkSuite.RunSuites = function (runner) { + var continuation = null + var suites = BenchmarkSuite.suites + var length = suites.length + BenchmarkSuite.scores = [] + var index = 0 + function RunStep() { + while (continuation || index < length) { + if (continuation) { + continuation = continuation() + } else { + var suite = suites[index++] + if (runner.NotifyStart) runner.NotifyStart(suite.name) + continuation = suite.RunStep(runner) + } + if (continuation && typeof window != 'undefined' && window.setTimeout) { + window.setTimeout(RunStep, 25) + return + } + } + if (runner.NotifyScore) { + var score = BenchmarkSuite.GeometricMean(BenchmarkSuite.scores) + var formatted = BenchmarkSuite.FormatScore(100 * score) + runner.NotifyScore(formatted) + } + } + RunStep() +} + +// Counts the total number of registered benchmarks. Useful for +// showing progress as a percentage. +BenchmarkSuite.CountBenchmarks = function () { + var result = 0 + var suites = BenchmarkSuite.suites + for (var i = 0; i < suites.length; i++) { + result += suites[i].benchmarks.length + } + return result +} + +// Computes the geometric mean of a set of numbers. +BenchmarkSuite.GeometricMean = function (numbers) { + var log = 0 + for (var i = 0; i < numbers.length; i++) { + log += Math.log(numbers[i]) + } + return Math.pow(Math.E, log / numbers.length) +} + +// Converts a score value to a string with at least three significant +// digits. +BenchmarkSuite.FormatScore = function (value) { + if (value > 100) { + return value.toFixed(0) + } else { + return value.toPrecision(3) + } +} + +// Notifies the runner that we're done running a single benchmark in +// the benchmark suite. This can be useful to report progress. +BenchmarkSuite.prototype.NotifyStep = function (result) { + this.results.push(result) + if (this.runner.NotifyStep) this.runner.NotifyStep(result.benchmark.name) +} + +// Notifies the runner that we're done with running a suite and that +// we have a result which can be reported to the user if needed. +BenchmarkSuite.prototype.NotifyResult = function () { + var mean = BenchmarkSuite.GeometricMean(this.results) + var score = this.reference / mean + BenchmarkSuite.scores.push(score) + if (this.runner.NotifyResult) { + var formatted = BenchmarkSuite.FormatScore(100 * score) + this.runner.NotifyResult(this.name, formatted) + } +} + +// Notifies the runner that running a benchmark resulted in an error. +BenchmarkSuite.prototype.NotifyError = function (error) { + if (this.runner.NotifyError) { + this.runner.NotifyError(this.name, error) + } + if (this.runner.NotifyStep) { + this.runner.NotifyStep(this.name) + } +} + +// Runs a single benchmark for at least a second and computes the +// average time it takes to run a single iteration. +BenchmarkSuite.prototype.RunSingleBenchmark = function (benchmark, data) { + function Measure(data) { + var elapsed = 0 + var start = new Date() + for (var n = 0; elapsed < 1000; n++) { + benchmark.run() + elapsed = new Date() - start + } + if (data != null) { + data.runs += n + data.elapsed += elapsed + } + } + + if (data == null) { + // Measure the benchmark once for warm up and throw the result + // away. Return a fresh data object. + Measure(null) + return { runs: 0, elapsed: 0 } + } else { + Measure(data) + // If we've run too few iterations, we continue for another second. + if (data.runs < 32) return data + var usec = (data.elapsed * 1000) / data.runs + this.NotifyStep(new BenchmarkResult(benchmark, usec)) + return null + } +} + +// This function starts running a suite, but stops between each +// individual benchmark in the suite and returns a continuation +// function which can be invoked to run the next benchmark. Once the +// last benchmark has been executed, null is returned. +BenchmarkSuite.prototype.RunStep = function (runner) { + this.results = [] + this.runner = runner + var length = this.benchmarks.length + var index = 0 + var suite = this + var data + + // Run the setup, the actual benchmark, and the tear down in three + // separate steps to allow the framework to yield between any of the + // steps. + + function RunNextSetup() { + if (index < length) { + try { + suite.benchmarks[index].Setup() + } catch (e) { + suite.NotifyError(e) + return null + } + return RunNextBenchmark + } + suite.NotifyResult() + return null + } + + function RunNextBenchmark() { + try { + data = suite.RunSingleBenchmark(suite.benchmarks[index], data) + } catch (e) { + suite.NotifyError(e) + return null + } + // If data is null, we're done with this benchmark. + return data == null ? RunNextTearDown : RunNextBenchmark() + } + + function RunNextTearDown() { + try { + suite.benchmarks[index++].TearDown() + } catch (e) { + suite.NotifyError(e) + return null + } + return RunNextSetup + } + + // Start out running the setup. + return RunNextSetup() +} +// Copyright 2006-2008 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This is a JavaScript implementation of the Richards +// benchmark from: +// +// http://www.cl.cam.ac.uk/~mr10/Bench.html +// +// The benchmark was originally implemented in BCPL by +// Martin Richards. + +/** + * The Richards benchmark simulates the task dispatcher of an + * operating system. + **/ +function runRichards() { + var scheduler = new Scheduler() + scheduler.addIdleTask(ID_IDLE, 0, null, COUNT) + + var queue = new Packet(null, ID_WORKER, KIND_WORK) + queue = new Packet(queue, ID_WORKER, KIND_WORK) + scheduler.addWorkerTask(ID_WORKER, 1000, queue) + + queue = new Packet(null, ID_DEVICE_A, KIND_DEVICE) + queue = new Packet(queue, ID_DEVICE_A, KIND_DEVICE) + queue = new Packet(queue, ID_DEVICE_A, KIND_DEVICE) + scheduler.addHandlerTask(ID_HANDLER_A, 2000, queue) + + queue = new Packet(null, ID_DEVICE_B, KIND_DEVICE) + queue = new Packet(queue, ID_DEVICE_B, KIND_DEVICE) + queue = new Packet(queue, ID_DEVICE_B, KIND_DEVICE) + scheduler.addHandlerTask(ID_HANDLER_B, 3000, queue) + + scheduler.addDeviceTask(ID_DEVICE_A, 4000, null) + + scheduler.addDeviceTask(ID_DEVICE_B, 5000, null) + + scheduler.schedule() + + if ( + scheduler.queueCount != EXPECTED_QUEUE_COUNT || + scheduler.holdCount != EXPECTED_HOLD_COUNT + ) { + var msg = + 'Error during execution: queueCount = ' + + scheduler.queueCount + + ', holdCount = ' + + scheduler.holdCount + + '.' + throw new Error(msg) + } +} + +var COUNT = 1000 + +/** + * These two constants specify how many times a packet is queued and + * how many times a task is put on hold in a correct run of richards. + * They don't have any meaning a such but are characteristic of a + * correct run so if the actual queue or hold count is different from + * the expected there must be a bug in the implementation. + **/ +var EXPECTED_QUEUE_COUNT = 2322 +var EXPECTED_HOLD_COUNT = 928 + +/** + * A scheduler can be used to schedule a set of tasks based on their relative + * priorities. Scheduling is done by maintaining a list of task control blocks + * which holds tasks and the data queue they are processing. + * @constructor + */ +function Scheduler() { + this.queueCount = 0 + this.holdCount = 0 + this.blocks = new Array(NUMBER_OF_IDS) + this.list = null + this.currentTcb = null + this.currentId = null +} + +var ID_IDLE = 0 +var ID_WORKER = 1 +var ID_HANDLER_A = 2 +var ID_HANDLER_B = 3 +var ID_DEVICE_A = 4 +var ID_DEVICE_B = 5 +var NUMBER_OF_IDS = 6 + +var KIND_DEVICE = 0 +var KIND_WORK = 1 + +/** + * Add an idle task to this scheduler. + * @param {int} id the identity of the task + * @param {int} priority the task's priority + * @param {Packet} queue the queue of work to be processed by the task + * @param {int} count the number of times to schedule the task + */ +Scheduler.prototype.addIdleTask = function (id, priority, queue, count) { + this.addRunningTask(id, priority, queue, new IdleTask(this, 1, count)) +} + +/** + * Add a work task to this scheduler. + * @param {int} id the identity of the task + * @param {int} priority the task's priority + * @param {Packet} queue the queue of work to be processed by the task + */ +Scheduler.prototype.addWorkerTask = function (id, priority, queue) { + this.addTask(id, priority, queue, new WorkerTask(this, ID_HANDLER_A, 0)) +} + +/** + * Add a handler task to this scheduler. + * @param {int} id the identity of the task + * @param {int} priority the task's priority + * @param {Packet} queue the queue of work to be processed by the task + */ +Scheduler.prototype.addHandlerTask = function (id, priority, queue) { + this.addTask(id, priority, queue, new HandlerTask(this)) +} + +/** + * Add a handler task to this scheduler. + * @param {int} id the identity of the task + * @param {int} priority the task's priority + * @param {Packet} queue the queue of work to be processed by the task + */ +Scheduler.prototype.addDeviceTask = function (id, priority, queue) { + this.addTask(id, priority, queue, new DeviceTask(this)) +} + +/** + * Add the specified task and mark it as running. + * @param {int} id the identity of the task + * @param {int} priority the task's priority + * @param {Packet} queue the queue of work to be processed by the task + * @param {Task} task the task to add + */ +Scheduler.prototype.addRunningTask = function (id, priority, queue, task) { + this.addTask(id, priority, queue, task) + this.currentTcb.setRunning() +} + +/** + * Add the specified task to this scheduler. + * @param {int} id the identity of the task + * @param {int} priority the task's priority + * @param {Packet} queue the queue of work to be processed by the task + * @param {Task} task the task to add + */ +Scheduler.prototype.addTask = function (id, priority, queue, task) { + this.currentTcb = new TaskControlBlock(this.list, id, priority, queue, task) + this.list = this.currentTcb + this.blocks[id] = this.currentTcb +} + +/** + * Execute the tasks managed by this scheduler. + */ +Scheduler.prototype.schedule = function () { + this.currentTcb = this.list + while (this.currentTcb != null) { + if (this.currentTcb.isHeldOrSuspended()) { + this.currentTcb = this.currentTcb.link + } else { + this.currentId = this.currentTcb.id + this.currentTcb = this.currentTcb.run() + } + } +} + +/** + * Release a task that is currently blocked and return the next block to run. + * @param {int} id the id of the task to suspend + */ +Scheduler.prototype.release = function (id) { + var tcb = this.blocks[id] + if (tcb == null) return tcb + tcb.markAsNotHeld() + if (tcb.priority > this.currentTcb.priority) { + return tcb + } else { + return this.currentTcb + } +} + +/** + * Block the currently executing task and return the next task control block + * to run. The blocked task will not be made runnable until it is explicitly + * released, even if new work is added to it. + */ +Scheduler.prototype.holdCurrent = function () { + this.holdCount++ + this.currentTcb.markAsHeld() + return this.currentTcb.link +} + +/** + * Suspend the currently executing task and return the next task control block + * to run. If new work is added to the suspended task it will be made runnable. + */ +Scheduler.prototype.suspendCurrent = function () { + this.currentTcb.markAsSuspended() + return this.currentTcb +} + +/** + * Add the specified packet to the end of the worklist used by the task + * associated with the packet and make the task runnable if it is currently + * suspended. + * @param {Packet} packet the packet to add + */ +Scheduler.prototype.queue = function (packet) { + var t = this.blocks[packet.id] + if (t == null) return t + this.queueCount++ + packet.link = null + packet.id = this.currentId + return t.checkPriorityAdd(this.currentTcb, packet) +} + +/** + * A task control block manages a task and the queue of work packages associated + * with it. + * @param {TaskControlBlock} link the preceding block in the linked block list + * @param {int} id the id of this block + * @param {int} priority the priority of this block + * @param {Packet} queue the queue of packages to be processed by the task + * @param {Task} task the task + * @constructor + */ +function TaskControlBlock(link, id, priority, queue, task) { + this.link = link + this.id = id + this.priority = priority + this.queue = queue + this.task = task + if (queue == null) { + this.state = STATE_SUSPENDED + } else { + this.state = STATE_SUSPENDED_RUNNABLE + } +} + +/** + * The task is running and is currently scheduled. + */ +var STATE_RUNNING = 0 + +/** + * The task has packets left to process. + */ +var STATE_RUNNABLE = 1 + +/** + * The task is not currently running. The task is not blocked as such and may + * be started by the scheduler. + */ +var STATE_SUSPENDED = 2 + +/** + * The task is blocked and cannot be run until it is explicitly released. + */ +var STATE_HELD = 4 + +var STATE_SUSPENDED_RUNNABLE = STATE_SUSPENDED | STATE_RUNNABLE +var STATE_NOT_HELD = ~STATE_HELD + +TaskControlBlock.prototype.setRunning = function () { + this.state = STATE_RUNNING +} + +TaskControlBlock.prototype.markAsNotHeld = function () { + this.state = this.state & STATE_NOT_HELD +} + +TaskControlBlock.prototype.markAsHeld = function () { + this.state = this.state | STATE_HELD +} + +TaskControlBlock.prototype.isHeldOrSuspended = function () { + return (this.state & STATE_HELD) != 0 || this.state == STATE_SUSPENDED +} + +TaskControlBlock.prototype.markAsSuspended = function () { + this.state = this.state | STATE_SUSPENDED +} + +TaskControlBlock.prototype.markAsRunnable = function () { + this.state = this.state | STATE_RUNNABLE +} + +/** + * Runs this task, if it is ready to be run, and returns the next task to run. + */ +TaskControlBlock.prototype.run = function () { + var packet + if (this.state == STATE_SUSPENDED_RUNNABLE) { + packet = this.queue + this.queue = packet.link + if (this.queue == null) { + this.state = STATE_RUNNING + } else { + this.state = STATE_RUNNABLE + } + } else { + packet = null + } + return this.task.run(packet) +} + +/** + * Adds a packet to the worklist of this block's task, marks this as runnable if + * necessary, and returns the next runnable object to run (the one + * with the highest priority). + */ +TaskControlBlock.prototype.checkPriorityAdd = function (task, packet) { + if (this.queue == null) { + this.queue = packet + this.markAsRunnable() + if (this.priority > task.priority) return this + } else { + this.queue = packet.addTo(this.queue) + } + return task +} + +TaskControlBlock.prototype.toString = function () { + return 'tcb { ' + this.task + '@' + this.state + ' }' +} + +/** + * An idle task doesn't do any work itself but cycles control between the two + * device tasks. + * @param {Scheduler} scheduler the scheduler that manages this task + * @param {int} v1 a seed value that controls how the device tasks are scheduled + * @param {int} count the number of times this task should be scheduled + * @constructor + */ +function IdleTask(scheduler, v1, count) { + this.scheduler = scheduler + this.v1 = v1 + this.count = count +} + +IdleTask.prototype.run = function (packet) { + this.count-- + if (this.count == 0) return this.scheduler.holdCurrent() + if ((this.v1 & 1) == 0) { + this.v1 = this.v1 >> 1 + return this.scheduler.release(ID_DEVICE_A) + } else { + this.v1 = (this.v1 >> 1) ^ 0xd008 + return this.scheduler.release(ID_DEVICE_B) + } +} + +IdleTask.prototype.toString = function () { + return 'IdleTask' +} + +/** + * A task that suspends itself after each time it has been run to simulate + * waiting for data from an external device. + * @param {Scheduler} scheduler the scheduler that manages this task + * @constructor + */ +function DeviceTask(scheduler) { + this.scheduler = scheduler + this.v1 = null +} + +DeviceTask.prototype.run = function (packet) { + if (packet == null) { + if (this.v1 == null) return this.scheduler.suspendCurrent() + var v = this.v1 + this.v1 = null + return this.scheduler.queue(v) + } else { + this.v1 = packet + return this.scheduler.holdCurrent() + } +} + +DeviceTask.prototype.toString = function () { + return 'DeviceTask' +} + +/** + * A task that manipulates work packets. + * @param {Scheduler} scheduler the scheduler that manages this task + * @param {int} v1 a seed used to specify how work packets are manipulated + * @param {int} v2 another seed used to specify how work packets are manipulated + * @constructor + */ +function WorkerTask(scheduler, v1, v2) { + this.scheduler = scheduler + this.v1 = v1 + this.v2 = v2 +} + +WorkerTask.prototype.run = function (packet) { + if (packet == null) { + return this.scheduler.suspendCurrent() + } else { + if (this.v1 == ID_HANDLER_A) { + this.v1 = ID_HANDLER_B + } else { + this.v1 = ID_HANDLER_A + } + packet.id = this.v1 + packet.a1 = 0 + for (var i = 0; i < DATA_SIZE; i++) { + this.v2++ + if (this.v2 > 26) this.v2 = 1 + packet.a2[i] = this.v2 + } + return this.scheduler.queue(packet) + } +} + +WorkerTask.prototype.toString = function () { + return 'WorkerTask' +} + +/** + * A task that manipulates work packets and then suspends itself. + * @param {Scheduler} scheduler the scheduler that manages this task + * @constructor + */ +function HandlerTask(scheduler) { + this.scheduler = scheduler + this.v1 = null + this.v2 = null +} + +HandlerTask.prototype.run = function (packet) { + if (packet != null) { + if (packet.kind == KIND_WORK) { + this.v1 = packet.addTo(this.v1) + } else { + this.v2 = packet.addTo(this.v2) + } + } + if (this.v1 != null) { + var count = this.v1.a1 + var v + if (count < DATA_SIZE) { + if (this.v2 != null) { + v = this.v2 + this.v2 = this.v2.link + v.a1 = this.v1.a2[count] + this.v1.a1 = count + 1 + return this.scheduler.queue(v) + } + } else { + v = this.v1 + this.v1 = this.v1.link + return this.scheduler.queue(v) + } + } + return this.scheduler.suspendCurrent() +} + +HandlerTask.prototype.toString = function () { + return 'HandlerTask' +} + +/* --- * + * P a c k e t + * --- */ + +var DATA_SIZE = 4 + +/** + * A simple package of data that is manipulated by the tasks. The exact layout + * of the payload data carried by a packet is not importaint, and neither is the + * nature of the work performed on packets by the tasks. + * + * Besides carrying data, packets form linked lists and are hence used both as + * data and worklists. + * @param {Packet} link the tail of the linked list of packets + * @param {int} id an ID for this packet + * @param {int} kind the type of this packet + * @constructor + */ +function Packet(link, id, kind) { + this.link = link + this.id = id + this.kind = kind + this.a1 = 0 + this.a2 = new Array(DATA_SIZE) +} + +/** + * Add this packet to the end of a worklist, and return the worklist. + * @param {Packet} queue the worklist to add this packet to + */ +Packet.prototype.addTo = function (queue) { + this.link = null + if (queue == null) return this + var peek, + next = queue + while ((peek = next.link) != null) next = peek + next.link = this + return queue +} + +Packet.prototype.toString = function () { + return 'Packet' +} + +var Richards = new BenchmarkSuite('Richards', 35302, [ + new Benchmark('Richards', runRichards), +]) + +// Copyright 2008 the V8 project authors. All rights reserved. +// Copyright 1996 John Maloney and Mario Wolczko. + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +// This implementation of the DeltaBlue benchmark is derived +// from the Smalltalk implementation by John Maloney and Mario +// Wolczko. Some parts have been translated directly, whereas +// others have been modified more aggresively to make it feel +// more like a JavaScript program. + +/** + * A JavaScript implementation of the DeltaBlue constraint-solving + * algorithm, as described in: + * + * "The DeltaBlue Algorithm: An Incremental Constraint Hierarchy Solver" + * Bjorn N. Freeman-Benson and John Maloney + * January 1990 Communications of the ACM, + * also available as University of Washington TR 89-08-06. + * + * Beware: this benchmark is written in a grotesque style where + * the constraint model is built by side-effects from constructors. + * I've kept it this way to avoid deviating too much from the original + * implementation. + */ + +/* --- O b j e c t M o d e l --- */ + +Object.prototype.inheritsFrom = function (shuper) { + function Inheriter() {} + Inheriter.prototype = shuper.prototype + this.prototype = new Inheriter() + this.superConstructor = shuper +} + +function OrderedCollection() { + this.elms = new Array() +} + +OrderedCollection.prototype.add = function (elm) { + this.elms.push(elm) +} + +OrderedCollection.prototype.at = function (index) { + return this.elms[index] +} + +OrderedCollection.prototype.size = function () { + return this.elms.length +} + +OrderedCollection.prototype.removeFirst = function () { + return this.elms.pop() +} + +OrderedCollection.prototype.remove = function (elm) { + var index = 0, + skipped = 0 + for (var i = 0; i < this.elms.length; i++) { + var value = this.elms[i] + if (value != elm) { + this.elms[index] = value + index++ + } else { + skipped++ + } + } + for (var i = 0; i < skipped; i++) this.elms.pop() +} + +/* --- * + * S t r e n g t h + * --- */ + +/** + * Strengths are used to measure the relative importance of constraints. + * New strengths may be inserted in the strength hierarchy without + * disrupting current constraints. Strengths cannot be created outside + * this class, so pointer comparison can be used for value comparison. + */ +function Strength(strengthValue, name) { + this.strengthValue = strengthValue + this.name = name +} + +Strength.stronger = function (s1, s2) { + return s1.strengthValue < s2.strengthValue +} + +Strength.weaker = function (s1, s2) { + return s1.strengthValue > s2.strengthValue +} + +Strength.weakestOf = function (s1, s2) { + return this.weaker(s1, s2) ? s1 : s2 +} + +Strength.strongest = function (s1, s2) { + return this.stronger(s1, s2) ? s1 : s2 +} + +Strength.prototype.nextWeaker = function () { + switch (this.strengthValue) { + case 0: + return Strength.STRONG_PREFERRED + case 1: + return Strength.PREFERRED + case 2: + return Strength.STRONG_DEFAULT + case 3: + return Strength.NORMAL + case 4: + return Strength.WEAK_DEFAULT + case 5: + return Strength.WEAKEST + } +} + +// Strength constants. +Strength.REQUIRED = new Strength(0, 'required') +Strength.STRONG_PREFERRED = new Strength(1, 'strongPreferred') +Strength.PREFERRED = new Strength(2, 'preferred') +Strength.STRONG_DEFAULT = new Strength(3, 'strongDefault') +Strength.NORMAL = new Strength(4, 'normal') +Strength.WEAK_DEFAULT = new Strength(5, 'weakDefault') +Strength.WEAKEST = new Strength(6, 'weakest') + +/* --- * + * C o n s t r a i n t + * --- */ + +/** + * An abstract class representing a system-maintainable relationship + * (or "constraint") between a set of variables. A constraint supplies + * a strength instance variable; concrete subclasses provide a means + * of storing the constrained variables and other information required + * to represent a constraint. + */ +function Constraint(strength) { + this.strength = strength +} + +/** + * Activate this constraint and attempt to satisfy it. + */ +Constraint.prototype.addConstraint = function () { + this.addToGraph() + planner.incrementalAdd(this) +} + +/** + * Attempt to find a way to enforce this constraint. If successful, + * record the solution, perhaps modifying the current dataflow + * graph. Answer the constraint that this constraint overrides, if + * there is one, or nil, if there isn't. + * Assume: I am not already satisfied. + */ +Constraint.prototype.satisfy = function (mark) { + this.chooseMethod(mark) + if (!this.isSatisfied()) { + if (this.strength == Strength.REQUIRED) + alert('Could not satisfy a required constraint!') + return null + } + this.markInputs(mark) + var out = this.output() + var overridden = out.determinedBy + if (overridden != null) overridden.markUnsatisfied() + out.determinedBy = this + if (!planner.addPropagate(this, mark)) alert('Cycle encountered') + out.mark = mark + return overridden +} + +Constraint.prototype.destroyConstraint = function () { + if (this.isSatisfied()) planner.incrementalRemove(this) + else this.removeFromGraph() +} + +/** + * Normal constraints are not input constraints. An input constraint + * is one that depends on external state, such as the mouse, the + * keybord, a clock, or some arbitraty piece of imperative code. + */ +Constraint.prototype.isInput = function () { + return false +} + +/* --- * + * U n a r y C o n s t r a i n t + * --- */ + +/** + * Abstract superclass for constraints having a single possible output + * variable. + */ +function UnaryConstraint(v, strength) { + UnaryConstraint.superConstructor.call(this, strength) + this.myOutput = v + this.satisfied = false + this.addConstraint() +} + +UnaryConstraint.inheritsFrom(Constraint) + +/** + * Adds this constraint to the constraint graph + */ +UnaryConstraint.prototype.addToGraph = function () { + this.myOutput.addConstraint(this) + this.satisfied = false +} + +/** + * Decides if this constraint can be satisfied and records that + * decision. + */ +UnaryConstraint.prototype.chooseMethod = function (mark) { + this.satisfied = + this.myOutput.mark != mark && + Strength.stronger(this.strength, this.myOutput.walkStrength) +} + +/** + * Returns true if this constraint is satisfied in the current solution. + */ +UnaryConstraint.prototype.isSatisfied = function () { + return this.satisfied +} + +UnaryConstraint.prototype.markInputs = function (mark) { + // has no inputs +} + +/** + * Returns the current output variable. + */ +UnaryConstraint.prototype.output = function () { + return this.myOutput +} + +/** + * Calculate the walkabout strength, the stay flag, and, if it is + * 'stay', the value for the current output of this constraint. Assume + * this constraint is satisfied. + */ +UnaryConstraint.prototype.recalculate = function () { + this.myOutput.walkStrength = this.strength + this.myOutput.stay = !this.isInput() + if (this.myOutput.stay) this.execute() // Stay optimization +} + +/** + * Records that this constraint is unsatisfied + */ +UnaryConstraint.prototype.markUnsatisfied = function () { + this.satisfied = false +} + +UnaryConstraint.prototype.inputsKnown = function () { + return true +} + +UnaryConstraint.prototype.removeFromGraph = function () { + if (this.myOutput != null) this.myOutput.removeConstraint(this) + this.satisfied = false +} + +/* --- * + * S t a y C o n s t r a i n t + * --- */ + +/** + * Variables that should, with some level of preference, stay the same. + * Planners may exploit the fact that instances, if satisfied, will not + * change their output during plan execution. This is called "stay + * optimization". + */ +function StayConstraint(v, str) { + StayConstraint.superConstructor.call(this, v, str) +} + +StayConstraint.inheritsFrom(UnaryConstraint) + +StayConstraint.prototype.execute = function () { + // Stay constraints do nothing +} + +/* --- * + * E d i t C o n s t r a i n t + * --- */ + +/** + * A unary input constraint used to mark a variable that the client + * wishes to change. + */ +function EditConstraint(v, str) { + EditConstraint.superConstructor.call(this, v, str) +} + +EditConstraint.inheritsFrom(UnaryConstraint) + +/** + * Edits indicate that a variable is to be changed by imperative code. + */ +EditConstraint.prototype.isInput = function () { + return true +} + +EditConstraint.prototype.execute = function () { + // Edit constraints do nothing +} + +/* --- * + * B i n a r y C o n s t r a i n t + * --- */ + +var Direction = new Object() +Direction.NONE = 0 +Direction.FORWARD = 1 +Direction.BACKWARD = -1 + +/** + * Abstract superclass for constraints having two possible output + * variables. + */ +function BinaryConstraint(var1, var2, strength) { + BinaryConstraint.superConstructor.call(this, strength) + this.v1 = var1 + this.v2 = var2 + this.direction = Direction.NONE + this.addConstraint() +} + +BinaryConstraint.inheritsFrom(Constraint) + +/** + * Decides if this constraint can be satisfied and which way it + * should flow based on the relative strength of the variables related, + * and record that decision. + */ +BinaryConstraint.prototype.chooseMethod = function (mark) { + if (this.v1.mark == mark) { + this.direction = + this.v2.mark != mark && + Strength.stronger(this.strength, this.v2.walkStrength) + ? Direction.FORWARD + : Direction.NONE + } + if (this.v2.mark == mark) { + this.direction = + this.v1.mark != mark && + Strength.stronger(this.strength, this.v1.walkStrength) + ? Direction.BACKWARD + : Direction.NONE + } + if (Strength.weaker(this.v1.walkStrength, this.v2.walkStrength)) { + this.direction = Strength.stronger(this.strength, this.v1.walkStrength) + ? Direction.BACKWARD + : Direction.NONE + } else { + this.direction = Strength.stronger(this.strength, this.v2.walkStrength) + ? Direction.FORWARD + : Direction.BACKWARD + } +} + +/** + * Add this constraint to the constraint graph + */ +BinaryConstraint.prototype.addToGraph = function () { + this.v1.addConstraint(this) + this.v2.addConstraint(this) + this.direction = Direction.NONE +} + +/** + * Answer true if this constraint is satisfied in the current solution. + */ +BinaryConstraint.prototype.isSatisfied = function () { + return this.direction != Direction.NONE +} + +/** + * Mark the input variable with the given mark. + */ +BinaryConstraint.prototype.markInputs = function (mark) { + this.input().mark = mark +} + +/** + * Returns the current input variable + */ +BinaryConstraint.prototype.input = function () { + return this.direction == Direction.FORWARD ? this.v1 : this.v2 +} + +/** + * Returns the current output variable + */ +BinaryConstraint.prototype.output = function () { + return this.direction == Direction.FORWARD ? this.v2 : this.v1 +} + +/** + * Calculate the walkabout strength, the stay flag, and, if it is + * 'stay', the value for the current output of this + * constraint. Assume this constraint is satisfied. + */ +BinaryConstraint.prototype.recalculate = function () { + var ihn = this.input(), + out = this.output() + out.walkStrength = Strength.weakestOf(this.strength, ihn.walkStrength) + out.stay = ihn.stay + if (out.stay) this.execute() +} + +/** + * Record the fact that this constraint is unsatisfied. + */ +BinaryConstraint.prototype.markUnsatisfied = function () { + this.direction = Direction.NONE +} + +BinaryConstraint.prototype.inputsKnown = function (mark) { + var i = this.input() + return i.mark == mark || i.stay || i.determinedBy == null +} + +BinaryConstraint.prototype.removeFromGraph = function () { + if (this.v1 != null) this.v1.removeConstraint(this) + if (this.v2 != null) this.v2.removeConstraint(this) + this.direction = Direction.NONE +} + +/* --- * + * S c a l e C o n s t r a i n t + * --- */ + +/** + * Relates two variables by the linear scaling relationship: "v2 = + * (v1 * scale) + offset". Either v1 or v2 may be changed to maintain + * this relationship but the scale factor and offset are considered + * read-only. + */ +function ScaleConstraint(src, scale, offset, dest, strength) { + this.direction = Direction.NONE + this.scale = scale + this.offset = offset + ScaleConstraint.superConstructor.call(this, src, dest, strength) +} + +ScaleConstraint.inheritsFrom(BinaryConstraint) + +/** + * Adds this constraint to the constraint graph. + */ +ScaleConstraint.prototype.addToGraph = function () { + ScaleConstraint.superConstructor.prototype.addToGraph.call(this) + this.scale.addConstraint(this) + this.offset.addConstraint(this) +} + +ScaleConstraint.prototype.removeFromGraph = function () { + ScaleConstraint.superConstructor.prototype.removeFromGraph.call(this) + if (this.scale != null) this.scale.removeConstraint(this) + if (this.offset != null) this.offset.removeConstraint(this) +} + +ScaleConstraint.prototype.markInputs = function (mark) { + ScaleConstraint.superConstructor.prototype.markInputs.call(this, mark) + this.scale.mark = this.offset.mark = mark +} + +/** + * Enforce this constraint. Assume that it is satisfied. + */ +ScaleConstraint.prototype.execute = function () { + if (this.direction == Direction.FORWARD) { + this.v2.value = this.v1.value * this.scale.value + this.offset.value + } else { + this.v1.value = (this.v2.value - this.offset.value) / this.scale.value + } +} + +/** + * Calculate the walkabout strength, the stay flag, and, if it is + * 'stay', the value for the current output of this constraint. Assume + * this constraint is satisfied. + */ +ScaleConstraint.prototype.recalculate = function () { + var ihn = this.input(), + out = this.output() + out.walkStrength = Strength.weakestOf(this.strength, ihn.walkStrength) + out.stay = ihn.stay && this.scale.stay && this.offset.stay + if (out.stay) this.execute() +} + +/* --- * + * E q u a l i t y C o n s t r a i n t + * --- */ + +/** + * Constrains two variables to have the same value. + */ +function EqualityConstraint(var1, var2, strength) { + EqualityConstraint.superConstructor.call(this, var1, var2, strength) +} + +EqualityConstraint.inheritsFrom(BinaryConstraint) + +/** + * Enforce this constraint. Assume that it is satisfied. + */ +EqualityConstraint.prototype.execute = function () { + this.output().value = this.input().value +} + +/* --- * + * V a r i a b l e + * --- */ + +/** + * A constrained variable. In addition to its value, it maintain the + * structure of the constraint graph, the current dataflow graph, and + * various parameters of interest to the DeltaBlue incremental + * constraint solver. + **/ +function Variable(name, initialValue) { + this.value = initialValue || 0 + this.constraints = new OrderedCollection() + this.determinedBy = null + this.mark = 0 + this.walkStrength = Strength.WEAKEST + this.stay = true + this.name = name +} + +/** + * Add the given constraint to the set of all constraints that refer + * this variable. + */ +Variable.prototype.addConstraint = function (c) { + this.constraints.add(c) +} + +/** + * Removes all traces of c from this variable. + */ +Variable.prototype.removeConstraint = function (c) { + this.constraints.remove(c) + if (this.determinedBy == c) this.determinedBy = null +} + +/* --- * + * P l a n n e r + * --- */ + +/** + * The DeltaBlue planner + */ +function Planner() { + this.currentMark = 0 +} + +/** + * Attempt to satisfy the given constraint and, if successful, + * incrementally update the dataflow graph. Details: If satifying + * the constraint is successful, it may override a weaker constraint + * on its output. The algorithm attempts to resatisfy that + * constraint using some other method. This process is repeated + * until either a) it reaches a variable that was not previously + * determined by any constraint or b) it reaches a constraint that + * is too weak to be satisfied using any of its methods. The + * variables of constraints that have been processed are marked with + * a unique mark value so that we know where we've been. This allows + * the algorithm to avoid getting into an infinite loop even if the + * constraint graph has an inadvertent cycle. + */ +Planner.prototype.incrementalAdd = function (c) { + var mark = this.newMark() + var overridden = c.satisfy(mark) + while (overridden != null) overridden = overridden.satisfy(mark) +} + +/** + * Entry point for retracting a constraint. Remove the given + * constraint and incrementally update the dataflow graph. + * Details: Retracting the given constraint may allow some currently + * unsatisfiable downstream constraint to be satisfied. We therefore collect + * a list of unsatisfied downstream constraints and attempt to + * satisfy each one in turn. This list is traversed by constraint + * strength, strongest first, as a heuristic for avoiding + * unnecessarily adding and then overriding weak constraints. + * Assume: c is satisfied. + */ +Planner.prototype.incrementalRemove = function (c) { + var out = c.output() + c.markUnsatisfied() + c.removeFromGraph() + var unsatisfied = this.removePropagateFrom(out) + var strength = Strength.REQUIRED + do { + for (var i = 0; i < unsatisfied.size(); i++) { + var u = unsatisfied.at(i) + if (u.strength == strength) this.incrementalAdd(u) + } + strength = strength.nextWeaker() + } while (strength != Strength.WEAKEST) +} + +/** + * Select a previously unused mark value. + */ +Planner.prototype.newMark = function () { + return ++this.currentMark +} + +/** + * Extract a plan for resatisfaction starting from the given source + * constraints, usually a set of input constraints. This method + * assumes that stay optimization is desired; the plan will contain + * only constraints whose output variables are not stay. Constraints + * that do no computation, such as stay and edit constraints, are + * not included in the plan. + * Details: The outputs of a constraint are marked when it is added + * to the plan under construction. A constraint may be appended to + * the plan when all its input variables are known. A variable is + * known if either a) the variable is marked (indicating that has + * been computed by a constraint appearing earlier in the plan), b) + * the variable is 'stay' (i.e. it is a constant at plan execution + * time), or c) the variable is not determined by any + * constraint. The last provision is for past states of history + * variables, which are not stay but which are also not computed by + * any constraint. + * Assume: sources are all satisfied. + */ +Planner.prototype.makePlan = function (sources) { + var mark = this.newMark() + var plan = new Plan() + var todo = sources + while (todo.size() > 0) { + var c = todo.removeFirst() + if (c.output().mark != mark && c.inputsKnown(mark)) { + plan.addConstraint(c) + c.output().mark = mark + this.addConstraintsConsumingTo(c.output(), todo) + } + } + return plan +} + +/** + * Extract a plan for resatisfying starting from the output of the + * given constraints, usually a set of input constraints. + */ +Planner.prototype.extractPlanFromConstraints = function (constraints) { + var sources = new OrderedCollection() + for (var i = 0; i < constraints.size(); i++) { + var c = constraints.at(i) + if (c.isInput() && c.isSatisfied()) + // not in plan already and eligible for inclusion + sources.add(c) + } + return this.makePlan(sources) +} + +/** + * Recompute the walkabout strengths and stay flags of all variables + * downstream of the given constraint and recompute the actual + * values of all variables whose stay flag is true. If a cycle is + * detected, remove the given constraint and answer + * false. Otherwise, answer true. + * Details: Cycles are detected when a marked variable is + * encountered downstream of the given constraint. The sender is + * assumed to have marked the inputs of the given constraint with + * the given mark. Thus, encountering a marked node downstream of + * the output constraint means that there is a path from the + * constraint's output to one of its inputs. + */ +Planner.prototype.addPropagate = function (c, mark) { + var todo = new OrderedCollection() + todo.add(c) + while (todo.size() > 0) { + var d = todo.removeFirst() + if (d.output().mark == mark) { + this.incrementalRemove(c) + return false + } + d.recalculate() + this.addConstraintsConsumingTo(d.output(), todo) + } + return true +} + +/** + * Update the walkabout strengths and stay flags of all variables + * downstream of the given constraint. Answer a collection of + * unsatisfied constraints sorted in order of decreasing strength. + */ +Planner.prototype.removePropagateFrom = function (out) { + out.determinedBy = null + out.walkStrength = Strength.WEAKEST + out.stay = true + var unsatisfied = new OrderedCollection() + var todo = new OrderedCollection() + todo.add(out) + while (todo.size() > 0) { + var v = todo.removeFirst() + for (var i = 0; i < v.constraints.size(); i++) { + var c = v.constraints.at(i) + if (!c.isSatisfied()) unsatisfied.add(c) + } + var determining = v.determinedBy + for (var i = 0; i < v.constraints.size(); i++) { + var next = v.constraints.at(i) + if (next != determining && next.isSatisfied()) { + next.recalculate() + todo.add(next.output()) + } + } + } + return unsatisfied +} + +Planner.prototype.addConstraintsConsumingTo = function (v, coll) { + var determining = v.determinedBy + var cc = v.constraints + for (var i = 0; i < cc.size(); i++) { + var c = cc.at(i) + if (c != determining && c.isSatisfied()) coll.add(c) + } +} + +/* --- * + * P l a n + * --- */ + +/** + * A Plan is an ordered list of constraints to be executed in sequence + * to resatisfy all currently satisfiable constraints in the face of + * one or more changing inputs. + */ +function Plan() { + this.v = new OrderedCollection() +} + +Plan.prototype.addConstraint = function (c) { + this.v.add(c) +} + +Plan.prototype.size = function () { + return this.v.size() +} + +Plan.prototype.constraintAt = function (index) { + return this.v.at(index) +} + +Plan.prototype.execute = function () { + for (var i = 0; i < this.size(); i++) { + var c = this.constraintAt(i) + c.execute() + } +} + +/* --- * + * M a i n + * --- */ + +/** + * This is the standard DeltaBlue benchmark. A long chain of equality + * constraints is constructed with a stay constraint on one end. An + * edit constraint is then added to the opposite end and the time is + * measured for adding and removing this constraint, and extracting + * and executing a constraint satisfaction plan. There are two cases. + * In case 1, the added constraint is stronger than the stay + * constraint and values must propagate down the entire length of the + * chain. In case 2, the added constraint is weaker than the stay + * constraint so it cannot be accomodated. The cost in this case is, + * of course, very low. Typical situations lie somewhere between these + * two extremes. + */ +function chainTest(n) { + planner = new Planner() + var prev = null, + first = null, + last = null + + // Build chain of n equality constraints + for (var i = 0; i <= n; i++) { + var name = 'v' + i + var v = new Variable(name) + if (prev != null) new EqualityConstraint(prev, v, Strength.REQUIRED) + if (i == 0) first = v + if (i == n) last = v + prev = v + } + + new StayConstraint(last, Strength.STRONG_DEFAULT) + var edit = new EditConstraint(first, Strength.PREFERRED) + var edits = new OrderedCollection() + edits.add(edit) + var plan = planner.extractPlanFromConstraints(edits) + for (var i = 0; i < 100; i++) { + first.value = i + plan.execute() + if (last.value != i) alert('Chain test failed.') + } +} + +/** + * This test constructs a two sets of variables related to each + * other by a simple linear transformation (scale and offset). The + * time is measured to change a variable on either side of the + * mapping and to change the scale and offset factors. + */ +function projectionTest(n) { + planner = new Planner() + var scale = new Variable('scale', 10) + var offset = new Variable('offset', 1000) + var src = null, + dst = null + + var dests = new OrderedCollection() + for (var i = 0; i < n; i++) { + src = new Variable('src' + i, i) + dst = new Variable('dst' + i, i) + dests.add(dst) + new StayConstraint(src, Strength.NORMAL) + new ScaleConstraint(src, scale, offset, dst, Strength.REQUIRED) + } + + change(src, 17) + if (dst.value != 1170) alert('Projection 1 failed') + change(dst, 1050) + if (src.value != 5) alert('Projection 2 failed') + change(scale, 5) + for (var i = 0; i < n - 1; i++) { + if (dests.at(i).value != i * 5 + 1000) alert('Projection 3 failed') + } + change(offset, 2000) + for (var i = 0; i < n - 1; i++) { + if (dests.at(i).value != i * 5 + 2000) alert('Projection 4 failed') + } +} + +function change(v, newValue) { + var edit = new EditConstraint(v, Strength.PREFERRED) + var edits = new OrderedCollection() + edits.add(edit) + var plan = planner.extractPlanFromConstraints(edits) + for (var i = 0; i < 10; i++) { + v.value = newValue + plan.execute() + } + edit.destroyConstraint() +} + +// Global variable holding the current planner. +var planner = null + +function deltaBlue() { + chainTest(100) + projectionTest(100) +} + +var DeltaBlue = new BenchmarkSuite('DeltaBlue', 66118, [ + new Benchmark('DeltaBlue', deltaBlue), +]) +/* + * Copyright (c) 2003-2005 Tom Wu + * 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" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL, + * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF + * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * In addition, the following condition applies: + * + * All redistributions must retain an intact copy of this copyright notice + * and disclaimer. + */ + +// Basic JavaScript BN library - subset useful for RSA encryption. + +// Bits per digit +var dbits +var BI_DB +var BI_DM +var BI_DV + +var BI_FP +var BI_FV +var BI_F1 +var BI_F2 + +// JavaScript engine analysis +var canary = 0xdeadbeefcafe +var j_lm = (canary & 0xffffff) == 0xefcafe + +// (public) Constructor +function BigInteger(a, b, c) { + this.array = new Array() + if (a != null) + if ('number' == typeof a) this.fromNumber(a, b, c) + else if (b == null && 'string' != typeof a) this.fromString(a, 256) + else this.fromString(a, b) +} + +// return new, unset BigInteger +function nbi() { + return new BigInteger(null) +} + +// am: Compute w_j += (x*this_i), propagate carries, +// c is initial carry, returns final carry. +// c < 3*dvalue, x < 2*dvalue, this_i < dvalue +// We need to select the fastest one that works in this environment. + +// am1: use a single mult and divide to get the high bits, +// max digit bits should be 26 because +// max internal value = 2*dvalue^2-2*dvalue (< 2^53) +function am1(i, x, w, j, c, n) { + var this_array = this.array + var w_array = w.array + while (--n >= 0) { + var v = x * this_array[i++] + w_array[j] + c + c = Math.floor(v / 0x4000000) + w_array[j++] = v & 0x3ffffff + } + return c +} + +// am2 avoids a big mult-and-extract completely. +// Max digit bits should be <= 30 because we do bitwise ops +// on values up to 2*hdvalue^2-hdvalue-1 (< 2^31) +function am2(i, x, w, j, c, n) { + var this_array = this.array + var w_array = w.array + var xl = x & 0x7fff, + xh = x >> 15 + while (--n >= 0) { + var l = this_array[i] & 0x7fff + var h = this_array[i++] >> 15 + var m = xh * l + h * xl + l = xl * l + ((m & 0x7fff) << 15) + w_array[j] + (c & 0x3fffffff) + c = (l >>> 30) + (m >>> 15) + xh * h + (c >>> 30) + w_array[j++] = l & 0x3fffffff + } + return c +} + +// Alternately, set max digit bits to 28 since some +// browsers slow down when dealing with 32-bit numbers. +function am3(i, x, w, j, c, n) { + var this_array = this.array + var w_array = w.array + + var xl = x & 0x3fff, + xh = x >> 14 + while (--n >= 0) { + var l = this_array[i] & 0x3fff + var h = this_array[i++] >> 14 + var m = xh * l + h * xl + l = xl * l + ((m & 0x3fff) << 14) + w_array[j] + c + c = (l >> 28) + (m >> 14) + xh * h + w_array[j++] = l & 0xfffffff + } + return c +} + +// This is tailored to VMs with 2-bit tagging. It makes sure +// that all the computations stay within the 29 bits available. +function am4(i, x, w, j, c, n) { + var this_array = this.array + var w_array = w.array + + var xl = x & 0x1fff, + xh = x >> 13 + while (--n >= 0) { + var l = this_array[i] & 0x1fff + var h = this_array[i++] >> 13 + var m = xh * l + h * xl + l = xl * l + ((m & 0x1fff) << 13) + w_array[j] + c + c = (l >> 26) + (m >> 13) + xh * h + w_array[j++] = l & 0x3ffffff + } + return c +} + +// am3/28 is best for SM, Rhino, but am4/26 is best for v8. +// Kestrel (Opera 9.5) gets its best result with am4/26. +// IE7 does 9% better with am3/28 than with am4/26. +// Firefox (SM) gets 10% faster with am3/28 than with am4/26. + +var setupEngine = function (fn, bits) { + BigInteger.prototype.am = fn + dbits = bits + + BI_DB = dbits + BI_DM = (1 << dbits) - 1 + BI_DV = 1 << dbits + + BI_FP = 52 + BI_FV = Math.pow(2, BI_FP) + BI_F1 = BI_FP - dbits + BI_F2 = 2 * dbits - BI_FP +} + +// Digit conversions +var BI_RM = '0123456789abcdefghijklmnopqrstuvwxyz' +var BI_RC = new Array() +var rr, vv +rr = '0'.charCodeAt(0) +for (vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv +rr = 'a'.charCodeAt(0) +for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv +rr = 'A'.charCodeAt(0) +for (vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv + +function int2char(n) { + return BI_RM.charAt(n) +} +function intAt(s, i) { + var c = BI_RC[s.charCodeAt(i)] + return c == null ? -1 : c +} + +// (protected) copy this to r +function bnpCopyTo(r) { + var this_array = this.array + var r_array = r.array + + for (var i = this.t - 1; i >= 0; --i) r_array[i] = this_array[i] + r.t = this.t + r.s = this.s +} + +// (protected) set from integer value x, -DV <= x < DV +function bnpFromInt(x) { + var this_array = this.array + this.t = 1 + this.s = x < 0 ? -1 : 0 + if (x > 0) this_array[0] = x + else if (x < -1) this_array[0] = x + DV + else this.t = 0 +} + +// return bigint initialized to value +function nbv(i) { + var r = nbi() + r.fromInt(i) + return r +} + +// (protected) set from string and radix +function bnpFromString(s, b) { + var this_array = this.array + var k + if (b == 16) k = 4 + else if (b == 8) k = 3 + else if (b == 256) k = 8 // byte array + else if (b == 2) k = 1 + else if (b == 32) k = 5 + else if (b == 4) k = 2 + else { + this.fromRadix(s, b) + return + } + this.t = 0 + this.s = 0 + var i = s.length, + mi = false, + sh = 0 + while (--i >= 0) { + var x = k == 8 ? s[i] & 0xff : intAt(s, i) + if (x < 0) { + if (s.charAt(i) == '-') mi = true + continue + } + mi = false + if (sh == 0) this_array[this.t++] = x + else if (sh + k > BI_DB) { + this_array[this.t - 1] |= (x & ((1 << (BI_DB - sh)) - 1)) << sh + this_array[this.t++] = x >> (BI_DB - sh) + } else this_array[this.t - 1] |= x << sh + sh += k + if (sh >= BI_DB) sh -= BI_DB + } + if (k == 8 && (s[0] & 0x80) != 0) { + this.s = -1 + if (sh > 0) this_array[this.t - 1] |= ((1 << (BI_DB - sh)) - 1) << sh + } + this.clamp() + if (mi) BigInteger.ZERO.subTo(this, this) +} + +// (protected) clamp off excess high words +function bnpClamp() { + var this_array = this.array + var c = this.s & BI_DM + while (this.t > 0 && this_array[this.t - 1] == c) --this.t +} + +// (public) return string representation in given radix +function bnToString(b) { + var this_array = this.array + if (this.s < 0) return '-' + this.negate().toString(b) + var k + if (b == 16) k = 4 + else if (b == 8) k = 3 + else if (b == 2) k = 1 + else if (b == 32) k = 5 + else if (b == 4) k = 2 + else return this.toRadix(b) + var km = (1 << k) - 1, + d, + m = false, + r = '', + i = this.t + var p = BI_DB - ((i * BI_DB) % k) + if (i-- > 0) { + if (p < BI_DB && (d = this_array[i] >> p) > 0) { + m = true + r = int2char(d) + } + while (i >= 0) { + if (p < k) { + d = (this_array[i] & ((1 << p) - 1)) << (k - p) + d |= this_array[--i] >> (p += BI_DB - k) + } else { + d = (this_array[i] >> (p -= k)) & km + if (p <= 0) { + p += BI_DB + --i + } + } + if (d > 0) m = true + if (m) r += int2char(d) + } + } + return m ? r : '0' +} + +// (public) -this +function bnNegate() { + var r = nbi() + BigInteger.ZERO.subTo(this, r) + return r +} + +// (public) |this| +function bnAbs() { + return this.s < 0 ? this.negate() : this +} + +// (public) return + if this > a, - if this < a, 0 if equal +function bnCompareTo(a) { + var this_array = this.array + var a_array = a.array + + var r = this.s - a.s + if (r != 0) return r + var i = this.t + r = i - a.t + if (r != 0) return r + while (--i >= 0) if ((r = this_array[i] - a_array[i]) != 0) return r + return 0 +} + +// returns bit length of the integer x +function nbits(x) { + var r = 1, + t + if ((t = x >>> 16) != 0) { + x = t + r += 16 + } + if ((t = x >> 8) != 0) { + x = t + r += 8 + } + if ((t = x >> 4) != 0) { + x = t + r += 4 + } + if ((t = x >> 2) != 0) { + x = t + r += 2 + } + if ((t = x >> 1) != 0) { + x = t + r += 1 + } + return r +} + +// (public) return the number of bits in "this" +function bnBitLength() { + var this_array = this.array + if (this.t <= 0) return 0 + return BI_DB * (this.t - 1) + nbits(this_array[this.t - 1] ^ (this.s & BI_DM)) +} + +// (protected) r = this << n*DB +function bnpDLShiftTo(n, r) { + var this_array = this.array + var r_array = r.array + var i + for (i = this.t - 1; i >= 0; --i) r_array[i + n] = this_array[i] + for (i = n - 1; i >= 0; --i) r_array[i] = 0 + r.t = this.t + n + r.s = this.s +} + +// (protected) r = this >> n*DB +function bnpDRShiftTo(n, r) { + var this_array = this.array + var r_array = r.array + for (var i = n; i < this.t; ++i) r_array[i - n] = this_array[i] + r.t = Math.max(this.t - n, 0) + r.s = this.s +} + +// (protected) r = this << n +function bnpLShiftTo(n, r) { + var this_array = this.array + var r_array = r.array + var bs = n % BI_DB + var cbs = BI_DB - bs + var bm = (1 << cbs) - 1 + var ds = Math.floor(n / BI_DB), + c = (this.s << bs) & BI_DM, + i + for (i = this.t - 1; i >= 0; --i) { + r_array[i + ds + 1] = (this_array[i] >> cbs) | c + c = (this_array[i] & bm) << bs + } + for (i = ds - 1; i >= 0; --i) r_array[i] = 0 + r_array[ds] = c + r.t = this.t + ds + 1 + r.s = this.s + r.clamp() +} + +// (protected) r = this >> n +function bnpRShiftTo(n, r) { + var this_array = this.array + var r_array = r.array + r.s = this.s + var ds = Math.floor(n / BI_DB) + if (ds >= this.t) { + r.t = 0 + return + } + var bs = n % BI_DB + var cbs = BI_DB - bs + var bm = (1 << bs) - 1 + r_array[0] = this_array[ds] >> bs + for (var i = ds + 1; i < this.t; ++i) { + r_array[i - ds - 1] |= (this_array[i] & bm) << cbs + r_array[i - ds] = this_array[i] >> bs + } + if (bs > 0) r_array[this.t - ds - 1] |= (this.s & bm) << cbs + r.t = this.t - ds + r.clamp() +} + +// (protected) r = this - a +function bnpSubTo(a, r) { + var this_array = this.array + var r_array = r.array + var a_array = a.array + var i = 0, + c = 0, + m = Math.min(a.t, this.t) + while (i < m) { + c += this_array[i] - a_array[i] + r_array[i++] = c & BI_DM + c >>= BI_DB + } + if (a.t < this.t) { + c -= a.s + while (i < this.t) { + c += this_array[i] + r_array[i++] = c & BI_DM + c >>= BI_DB + } + c += this.s + } else { + c += this.s + while (i < a.t) { + c -= a_array[i] + r_array[i++] = c & BI_DM + c >>= BI_DB + } + c -= a.s + } + r.s = c < 0 ? -1 : 0 + if (c < -1) r_array[i++] = BI_DV + c + else if (c > 0) r_array[i++] = c + r.t = i + r.clamp() +} + +// (protected) r = this * a, r != this,a (HAC 14.12) +// "this" should be the larger one if appropriate. +function bnpMultiplyTo(a, r) { + var this_array = this.array + var r_array = r.array + var x = this.abs(), + y = a.abs() + var y_array = y.array + + var i = x.t + r.t = i + y.t + while (--i >= 0) r_array[i] = 0 + for (i = 0; i < y.t; ++i) r_array[i + x.t] = x.am(0, y_array[i], r, i, 0, x.t) + r.s = 0 + r.clamp() + if (this.s != a.s) BigInteger.ZERO.subTo(r, r) +} + +// (protected) r = this^2, r != this (HAC 14.16) +function bnpSquareTo(r) { + var x = this.abs() + var x_array = x.array + var r_array = r.array + + var i = (r.t = 2 * x.t) + while (--i >= 0) r_array[i] = 0 + for (i = 0; i < x.t - 1; ++i) { + var c = x.am(i, x_array[i], r, 2 * i, 0, 1) + if ( + (r_array[i + x.t] += x.am( + i + 1, + 2 * x_array[i], + r, + 2 * i + 1, + c, + x.t - i - 1 + )) >= BI_DV + ) { + r_array[i + x.t] -= BI_DV + r_array[i + x.t + 1] = 1 + } + } + if (r.t > 0) r_array[r.t - 1] += x.am(i, x_array[i], r, 2 * i, 0, 1) + r.s = 0 + r.clamp() +} + +// (protected) divide this by m, quotient and remainder to q, r (HAC 14.20) +// r != q, this != m. q or r may be null. +function bnpDivRemTo(m, q, r) { + var pm = m.abs() + if (pm.t <= 0) return + var pt = this.abs() + if (pt.t < pm.t) { + if (q != null) q.fromInt(0) + if (r != null) this.copyTo(r) + return + } + if (r == null) r = nbi() + var y = nbi(), + ts = this.s, + ms = m.s + var pm_array = pm.array + var nsh = BI_DB - nbits(pm_array[pm.t - 1]) // normalize modulus + if (nsh > 0) { + pm.lShiftTo(nsh, y) + pt.lShiftTo(nsh, r) + } else { + pm.copyTo(y) + pt.copyTo(r) + } + var ys = y.t + + var y_array = y.array + var y0 = y_array[ys - 1] + if (y0 == 0) return + var yt = y0 * (1 << BI_F1) + (ys > 1 ? y_array[ys - 2] >> BI_F2 : 0) + var d1 = BI_FV / yt, + d2 = (1 << BI_F1) / yt, + e = 1 << BI_F2 + var i = r.t, + j = i - ys, + t = q == null ? nbi() : q + y.dlShiftTo(j, t) + + var r_array = r.array + if (r.compareTo(t) >= 0) { + r_array[r.t++] = 1 + r.subTo(t, r) + } + BigInteger.ONE.dlShiftTo(ys, t) + t.subTo(y, y) // "negative" y so we can replace sub with am later + while (y.t < ys) y_array[y.t++] = 0 + while (--j >= 0) { + // Estimate quotient digit + var qd = + r_array[--i] == y0 + ? BI_DM + : Math.floor(r_array[i] * d1 + (r_array[i - 1] + e) * d2) + if ((r_array[i] += y.am(0, qd, r, j, 0, ys)) < qd) { + // Try it out + y.dlShiftTo(j, t) + r.subTo(t, r) + while (r_array[i] < --qd) r.subTo(t, r) + } + } + if (q != null) { + r.drShiftTo(ys, q) + if (ts != ms) BigInteger.ZERO.subTo(q, q) + } + r.t = ys + r.clamp() + if (nsh > 0) r.rShiftTo(nsh, r) // Denormalize remainder + if (ts < 0) BigInteger.ZERO.subTo(r, r) +} + +// (public) this mod a +function bnMod(a) { + var r = nbi() + this.abs().divRemTo(a, null, r) + if (this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r, r) + return r +} + +// Modular reduction using "classic" algorithm +function Classic(m) { + this.m = m +} +function cConvert(x) { + if (x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m) + else return x +} +function cRevert(x) { + return x +} +function cReduce(x) { + x.divRemTo(this.m, null, x) +} +function cMulTo(x, y, r) { + x.multiplyTo(y, r) + this.reduce(r) +} +function cSqrTo(x, r) { + x.squareTo(r) + this.reduce(r) +} + +Classic.prototype.convert = cConvert +Classic.prototype.revert = cRevert +Classic.prototype.reduce = cReduce +Classic.prototype.mulTo = cMulTo +Classic.prototype.sqrTo = cSqrTo + +// (protected) return "-1/this % 2^DB"; useful for Mont. reduction +// justification: +// xy == 1 (mod m) +// xy = 1+km +// xy(2-xy) = (1+km)(1-km) +// x[y(2-xy)] = 1-k^2m^2 +// x[y(2-xy)] == 1 (mod m^2) +// if y is 1/x mod m, then y(2-xy) is 1/x mod m^2 +// should reduce x and y(2-xy) by m^2 at each step to keep size bounded. +// JS multiply "overflows" differently from C/C++, so care is needed here. +function bnpInvDigit() { + var this_array = this.array + if (this.t < 1) return 0 + var x = this_array[0] + if ((x & 1) == 0) return 0 + var y = x & 3 // y == 1/x mod 2^2 + y = (y * (2 - (x & 0xf) * y)) & 0xf // y == 1/x mod 2^4 + y = (y * (2 - (x & 0xff) * y)) & 0xff // y == 1/x mod 2^8 + y = (y * (2 - (((x & 0xffff) * y) & 0xffff))) & 0xffff // y == 1/x mod 2^16 + // last step - calculate inverse mod DV directly; + // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints + y = (y * (2 - ((x * y) % BI_DV))) % BI_DV // y == 1/x mod 2^dbits + // we really want the negative inverse, and -DV < y < DV + return y > 0 ? BI_DV - y : -y +} + +// Montgomery reduction +function Montgomery(m) { + this.m = m + this.mp = m.invDigit() + this.mpl = this.mp & 0x7fff + this.mph = this.mp >> 15 + this.um = (1 << (BI_DB - 15)) - 1 + this.mt2 = 2 * m.t +} + +// xR mod m +function montConvert(x) { + var r = nbi() + x.abs().dlShiftTo(this.m.t, r) + r.divRemTo(this.m, null, r) + if (x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r, r) + return r +} + +// x/R mod m +function montRevert(x) { + var r = nbi() + x.copyTo(r) + this.reduce(r) + return r +} + +// x = x/R mod m (HAC 14.32) +function montReduce(x) { + var x_array = x.array + while (x.t <= this.mt2) + // pad x so am has enough room later + x_array[x.t++] = 0 + for (var i = 0; i < this.m.t; ++i) { + // faster way of calculating u0 = x[i]*mp mod DV + var j = x_array[i] & 0x7fff + var u0 = + (j * this.mpl + + (((j * this.mph + (x_array[i] >> 15) * this.mpl) & this.um) << 15)) & + BI_DM + // use am to combine the multiply-shift-add into one call + j = i + this.m.t + x_array[j] += this.m.am(0, u0, x, i, 0, this.m.t) + // propagate carry + while (x_array[j] >= BI_DV) { + x_array[j] -= BI_DV + x_array[++j]++ + } + } + x.clamp() + x.drShiftTo(this.m.t, x) + if (x.compareTo(this.m) >= 0) x.subTo(this.m, x) +} + +// r = "x^2/R mod m"; x != r +function montSqrTo(x, r) { + x.squareTo(r) + this.reduce(r) +} + +// r = "xy/R mod m"; x,y != r +function montMulTo(x, y, r) { + x.multiplyTo(y, r) + this.reduce(r) +} + +Montgomery.prototype.convert = montConvert +Montgomery.prototype.revert = montRevert +Montgomery.prototype.reduce = montReduce +Montgomery.prototype.mulTo = montMulTo +Montgomery.prototype.sqrTo = montSqrTo + +// (protected) true iff this is even +function bnpIsEven() { + var this_array = this.array + return (this.t > 0 ? this_array[0] & 1 : this.s) == 0 +} + +// (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79) +function bnpExp(e, z) { + if (e > 0xffffffff || e < 1) return BigInteger.ONE + var r = nbi(), + r2 = nbi(), + g = z.convert(this), + i = nbits(e) - 1 + g.copyTo(r) + while (--i >= 0) { + z.sqrTo(r, r2) + if ((e & (1 << i)) > 0) z.mulTo(r2, g, r) + else { + var t = r + r = r2 + r2 = t + } + } + return z.revert(r) +} + +// (public) this^e % m, 0 <= e < 2^32 +function bnModPowInt(e, m) { + var z + if (e < 256 || m.isEven()) z = new Classic(m) + else z = new Montgomery(m) + return this.exp(e, z) +} + +// protected +BigInteger.prototype.copyTo = bnpCopyTo +BigInteger.prototype.fromInt = bnpFromInt +BigInteger.prototype.fromString = bnpFromString +BigInteger.prototype.clamp = bnpClamp +BigInteger.prototype.dlShiftTo = bnpDLShiftTo +BigInteger.prototype.drShiftTo = bnpDRShiftTo +BigInteger.prototype.lShiftTo = bnpLShiftTo +BigInteger.prototype.rShiftTo = bnpRShiftTo +BigInteger.prototype.subTo = bnpSubTo +BigInteger.prototype.multiplyTo = bnpMultiplyTo +BigInteger.prototype.squareTo = bnpSquareTo +BigInteger.prototype.divRemTo = bnpDivRemTo +BigInteger.prototype.invDigit = bnpInvDigit +BigInteger.prototype.isEven = bnpIsEven +BigInteger.prototype.exp = bnpExp + +// public +BigInteger.prototype.toString = bnToString +BigInteger.prototype.negate = bnNegate +BigInteger.prototype.abs = bnAbs +BigInteger.prototype.compareTo = bnCompareTo +BigInteger.prototype.bitLength = bnBitLength +BigInteger.prototype.mod = bnMod +BigInteger.prototype.modPowInt = bnModPowInt + +// "constants" +BigInteger.ZERO = nbv(0) +BigInteger.ONE = nbv(1) +// Copyright (c) 2005 Tom Wu +// All Rights Reserved. +// See "LICENSE" for details. + +// Extended JavaScript BN functions, required for RSA private ops. + +// (public) +function bnClone() { + var r = nbi() + this.copyTo(r) + return r +} + +// (public) return value as integer +function bnIntValue() { + var this_array = this.array + if (this.s < 0) { + if (this.t == 1) return this_array[0] - BI_DV + else if (this.t == 0) return -1 + } else if (this.t == 1) return this_array[0] + else if (this.t == 0) return 0 + // assumes 16 < DB < 32 + return ((this_array[1] & ((1 << (32 - BI_DB)) - 1)) << BI_DB) | this_array[0] +} + +// (public) return value as byte +function bnByteValue() { + var this_array = this.array + return this.t == 0 ? this.s : (this_array[0] << 24) >> 24 +} + +// (public) return value as short (assumes DB>=16) +function bnShortValue() { + var this_array = this.array + return this.t == 0 ? this.s : (this_array[0] << 16) >> 16 +} + +// (protected) return x s.t. r^x < DV +function bnpChunkSize(r) { + return Math.floor((Math.LN2 * BI_DB) / Math.log(r)) +} + +// (public) 0 if this == 0, 1 if this > 0 +function bnSigNum() { + var this_array = this.array + if (this.s < 0) return -1 + else if (this.t <= 0 || (this.t == 1 && this_array[0] <= 0)) return 0 + else return 1 +} + +// (protected) convert to radix string +function bnpToRadix(b) { + if (b == null) b = 10 + if (this.signum() == 0 || b < 2 || b > 36) return '0' + var cs = this.chunkSize(b) + var a = Math.pow(b, cs) + var d = nbv(a), + y = nbi(), + z = nbi(), + r = '' + this.divRemTo(d, y, z) + while (y.signum() > 0) { + r = (a + z.intValue()).toString(b).substr(1) + r + y.divRemTo(d, y, z) + } + return z.intValue().toString(b) + r +} + +// (protected) convert from radix string +function bnpFromRadix(s, b) { + this.fromInt(0) + if (b == null) b = 10 + var cs = this.chunkSize(b) + var d = Math.pow(b, cs), + mi = false, + j = 0, + w = 0 + for (var i = 0; i < s.length; ++i) { + var x = intAt(s, i) + if (x < 0) { + if (s.charAt(i) == '-' && this.signum() == 0) mi = true + continue + } + w = b * w + x + if (++j >= cs) { + this.dMultiply(d) + this.dAddOffset(w, 0) + j = 0 + w = 0 + } + } + if (j > 0) { + this.dMultiply(Math.pow(b, j)) + this.dAddOffset(w, 0) + } + if (mi) BigInteger.ZERO.subTo(this, this) +} + +// (protected) alternate constructor +function bnpFromNumber(a, b, c) { + if ('number' == typeof b) { + // new BigInteger(int,int,RNG) + if (a < 2) this.fromInt(1) + else { + this.fromNumber(a, c) + if (!this.testBit(a - 1)) + // force MSB set + this.bitwiseTo(BigInteger.ONE.shiftLeft(a - 1), op_or, this) + if (this.isEven()) this.dAddOffset(1, 0) // force odd + while (!this.isProbablePrime(b)) { + this.dAddOffset(2, 0) + if (this.bitLength() > a) + this.subTo(BigInteger.ONE.shiftLeft(a - 1), this) + } + } + } else { + // new BigInteger(int,RNG) + var x = new Array(), + t = a & 7 + x.length = (a >> 3) + 1 + b.nextBytes(x) + if (t > 0) x[0] &= (1 << t) - 1 + else x[0] = 0 + this.fromString(x, 256) + } +} + +// (public) convert to bigendian byte array +function bnToByteArray() { + var this_array = this.array + var i = this.t, + r = new Array() + r[0] = this.s + var p = BI_DB - ((i * BI_DB) % 8), + d, + k = 0 + if (i-- > 0) { + if (p < BI_DB && (d = this_array[i] >> p) != (this.s & BI_DM) >> p) + r[k++] = d | (this.s << (BI_DB - p)) + while (i >= 0) { + if (p < 8) { + d = (this_array[i] & ((1 << p) - 1)) << (8 - p) + d |= this_array[--i] >> (p += BI_DB - 8) + } else { + d = (this_array[i] >> (p -= 8)) & 0xff + if (p <= 0) { + p += BI_DB + --i + } + } + if ((d & 0x80) != 0) d |= -256 + if (k == 0 && (this.s & 0x80) != (d & 0x80)) ++k + if (k > 0 || d != this.s) r[k++] = d + } + } + return r +} + +function bnEquals(a) { + return this.compareTo(a) == 0 +} +function bnMin(a) { + return this.compareTo(a) < 0 ? this : a +} +function bnMax(a) { + return this.compareTo(a) > 0 ? this : a +} + +// (protected) r = this op a (bitwise) +function bnpBitwiseTo(a, op, r) { + var this_array = this.array + var a_array = a.array + var r_array = r.array + var i, + f, + m = Math.min(a.t, this.t) + for (i = 0; i < m; ++i) r_array[i] = op(this_array[i], a_array[i]) + if (a.t < this.t) { + f = a.s & BI_DM + for (i = m; i < this.t; ++i) r_array[i] = op(this_array[i], f) + r.t = this.t + } else { + f = this.s & BI_DM + for (i = m; i < a.t; ++i) r_array[i] = op(f, a_array[i]) + r.t = a.t + } + r.s = op(this.s, a.s) + r.clamp() +} + +// (public) this & a +function op_and(x, y) { + return x & y +} +function bnAnd(a) { + var r = nbi() + this.bitwiseTo(a, op_and, r) + return r +} + +// (public) this | a +function op_or(x, y) { + return x | y +} +function bnOr(a) { + var r = nbi() + this.bitwiseTo(a, op_or, r) + return r +} + +// (public) this ^ a +function op_xor(x, y) { + return x ^ y +} +function bnXor(a) { + var r = nbi() + this.bitwiseTo(a, op_xor, r) + return r +} + +// (public) this & ~a +function op_andnot(x, y) { + return x & ~y +} +function bnAndNot(a) { + var r = nbi() + this.bitwiseTo(a, op_andnot, r) + return r +} + +// (public) ~this +function bnNot() { + var this_array = this.array + var r = nbi() + var r_array = r.array + + for (var i = 0; i < this.t; ++i) r_array[i] = BI_DM & ~this_array[i] + r.t = this.t + r.s = ~this.s + return r +} + +// (public) this << n +function bnShiftLeft(n) { + var r = nbi() + if (n < 0) this.rShiftTo(-n, r) + else this.lShiftTo(n, r) + return r +} + +// (public) this >> n +function bnShiftRight(n) { + var r = nbi() + if (n < 0) this.lShiftTo(-n, r) + else this.rShiftTo(n, r) + return r +} + +// return index of lowest 1-bit in x, x < 2^31 +function lbit(x) { + if (x == 0) return -1 + var r = 0 + if ((x & 0xffff) == 0) { + x >>= 16 + r += 16 + } + if ((x & 0xff) == 0) { + x >>= 8 + r += 8 + } + if ((x & 0xf) == 0) { + x >>= 4 + r += 4 + } + if ((x & 3) == 0) { + x >>= 2 + r += 2 + } + if ((x & 1) == 0) ++r + return r +} + +// (public) returns index of lowest 1-bit (or -1 if none) +function bnGetLowestSetBit() { + var this_array = this.array + for (var i = 0; i < this.t; ++i) + if (this_array[i] != 0) return i * BI_DB + lbit(this_array[i]) + if (this.s < 0) return this.t * BI_DB + return -1 +} + +// return number of 1 bits in x +function cbit(x) { + var r = 0 + while (x != 0) { + x &= x - 1 + ++r + } + return r +} + +// (public) return number of set bits +function bnBitCount() { + var r = 0, + x = this.s & BI_DM + for (var i = 0; i < this.t; ++i) r += cbit(this_array[i] ^ x) + return r +} + +// (public) true iff nth bit is set +function bnTestBit(n) { + var this_array = this.array + var j = Math.floor(n / BI_DB) + if (j >= this.t) return this.s != 0 + return (this_array[j] & (1 << n % BI_DB)) != 0 +} + +// (protected) this op (1<>= BI_DB + } + if (a.t < this.t) { + c += a.s + while (i < this.t) { + c += this_array[i] + r_array[i++] = c & BI_DM + c >>= BI_DB + } + c += this.s + } else { + c += this.s + while (i < a.t) { + c += a_array[i] + r_array[i++] = c & BI_DM + c >>= BI_DB + } + c += a.s + } + r.s = c < 0 ? -1 : 0 + if (c > 0) r_array[i++] = c + else if (c < -1) r_array[i++] = BI_DV + c + r.t = i + r.clamp() +} + +// (public) this + a +function bnAdd(a) { + var r = nbi() + this.addTo(a, r) + return r +} + +// (public) this - a +function bnSubtract(a) { + var r = nbi() + this.subTo(a, r) + return r +} + +// (public) this * a +function bnMultiply(a) { + var r = nbi() + this.multiplyTo(a, r) + return r +} + +// (public) this / a +function bnDivide(a) { + var r = nbi() + this.divRemTo(a, r, null) + return r +} + +// (public) this % a +function bnRemainder(a) { + var r = nbi() + this.divRemTo(a, null, r) + return r +} + +// (public) [this/a,this%a] +function bnDivideAndRemainder(a) { + var q = nbi(), + r = nbi() + this.divRemTo(a, q, r) + return new Array(q, r) +} + +// (protected) this *= n, this >= 0, 1 < n < DV +function bnpDMultiply(n) { + var this_array = this.array + this_array[this.t] = this.am(0, n - 1, this, 0, 0, this.t) + ++this.t + this.clamp() +} + +// (protected) this += n << w words, this >= 0 +function bnpDAddOffset(n, w) { + var this_array = this.array + while (this.t <= w) this_array[this.t++] = 0 + this_array[w] += n + while (this_array[w] >= BI_DV) { + this_array[w] -= BI_DV + if (++w >= this.t) this_array[this.t++] = 0 + ++this_array[w] + } +} + +// A "null" reducer +function NullExp() {} +function nNop(x) { + return x +} +function nMulTo(x, y, r) { + x.multiplyTo(y, r) +} +function nSqrTo(x, r) { + x.squareTo(r) +} + +NullExp.prototype.convert = nNop +NullExp.prototype.revert = nNop +NullExp.prototype.mulTo = nMulTo +NullExp.prototype.sqrTo = nSqrTo + +// (public) this^e +function bnPow(e) { + return this.exp(e, new NullExp()) +} + +// (protected) r = lower n words of "this * a", a.t <= n +// "this" should be the larger one if appropriate. +function bnpMultiplyLowerTo(a, n, r) { + var r_array = r.array + var a_array = a.array + var i = Math.min(this.t + a.t, n) + r.s = 0 // assumes a,this >= 0 + r.t = i + while (i > 0) r_array[--i] = 0 + var j + for (j = r.t - this.t; i < j; ++i) + r_array[i + this.t] = this.am(0, a_array[i], r, i, 0, this.t) + for (j = Math.min(a.t, n); i < j; ++i) this.am(0, a_array[i], r, i, 0, n - i) + r.clamp() +} + +// (protected) r = "this * a" without lower n words, n > 0 +// "this" should be the larger one if appropriate. +function bnpMultiplyUpperTo(a, n, r) { + var r_array = r.array + var a_array = a.array + --n + var i = (r.t = this.t + a.t - n) + r.s = 0 // assumes a,this >= 0 + while (--i >= 0) r_array[i] = 0 + for (i = Math.max(n - this.t, 0); i < a.t; ++i) + r_array[this.t + i - n] = this.am( + n - i, + a_array[i], + r, + 0, + 0, + this.t + i - n + ) + r.clamp() + r.drShiftTo(1, r) +} + +// Barrett modular reduction +function Barrett(m) { + // setup Barrett + this.r2 = nbi() + this.q3 = nbi() + BigInteger.ONE.dlShiftTo(2 * m.t, this.r2) + this.mu = this.r2.divide(m) + this.m = m +} + +function barrettConvert(x) { + if (x.s < 0 || x.t > 2 * this.m.t) return x.mod(this.m) + else if (x.compareTo(this.m) < 0) return x + else { + var r = nbi() + x.copyTo(r) + this.reduce(r) + return r + } +} + +function barrettRevert(x) { + return x +} + +// x = x mod m (HAC 14.42) +function barrettReduce(x) { + x.drShiftTo(this.m.t - 1, this.r2) + if (x.t > this.m.t + 1) { + x.t = this.m.t + 1 + x.clamp() + } + this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3) + this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2) + while (x.compareTo(this.r2) < 0) x.dAddOffset(1, this.m.t + 1) + x.subTo(this.r2, x) + while (x.compareTo(this.m) >= 0) x.subTo(this.m, x) +} + +// r = x^2 mod m; x != r +function barrettSqrTo(x, r) { + x.squareTo(r) + this.reduce(r) +} + +// r = x*y mod m; x,y != r +function barrettMulTo(x, y, r) { + x.multiplyTo(y, r) + this.reduce(r) +} + +Barrett.prototype.convert = barrettConvert +Barrett.prototype.revert = barrettRevert +Barrett.prototype.reduce = barrettReduce +Barrett.prototype.mulTo = barrettMulTo +Barrett.prototype.sqrTo = barrettSqrTo + +// (public) this^e % m (HAC 14.85) +function bnModPow(e, m) { + var e_array = e.array + var i = e.bitLength(), + k, + r = nbv(1), + z + if (i <= 0) return r + else if (i < 18) k = 1 + else if (i < 48) k = 3 + else if (i < 144) k = 4 + else if (i < 768) k = 5 + else k = 6 + if (i < 8) z = new Classic(m) + else if (m.isEven()) z = new Barrett(m) + else z = new Montgomery(m) + + // precomputation + var g = new Array(), + n = 3, + k1 = k - 1, + km = (1 << k) - 1 + g[1] = z.convert(this) + if (k > 1) { + var g2 = nbi() + z.sqrTo(g[1], g2) + while (n <= km) { + g[n] = nbi() + z.mulTo(g2, g[n - 2], g[n]) + n += 2 + } + } + + var j = e.t - 1, + w, + is1 = true, + r2 = nbi(), + t + i = nbits(e_array[j]) - 1 + while (j >= 0) { + if (i >= k1) w = (e_array[j] >> (i - k1)) & km + else { + w = (e_array[j] & ((1 << (i + 1)) - 1)) << (k1 - i) + if (j > 0) w |= e_array[j - 1] >> (BI_DB + i - k1) + } + + n = k + while ((w & 1) == 0) { + w >>= 1 + --n + } + if ((i -= n) < 0) { + i += BI_DB + --j + } + if (is1) { + // ret == 1, don't bother squaring or multiplying it + g[w].copyTo(r) + is1 = false + } else { + while (n > 1) { + z.sqrTo(r, r2) + z.sqrTo(r2, r) + n -= 2 + } + if (n > 0) z.sqrTo(r, r2) + else { + t = r + r = r2 + r2 = t + } + z.mulTo(r2, g[w], r) + } + + while (j >= 0 && (e_array[j] & (1 << i)) == 0) { + z.sqrTo(r, r2) + t = r + r = r2 + r2 = t + if (--i < 0) { + i = BI_DB - 1 + --j + } + } + } + return z.revert(r) +} + +// (public) gcd(this,a) (HAC 14.54) +function bnGCD(a) { + var x = this.s < 0 ? this.negate() : this.clone() + var y = a.s < 0 ? a.negate() : a.clone() + if (x.compareTo(y) < 0) { + var t = x + x = y + y = t + } + var i = x.getLowestSetBit(), + g = y.getLowestSetBit() + if (g < 0) return x + if (i < g) g = i + if (g > 0) { + x.rShiftTo(g, x) + y.rShiftTo(g, y) + } + while (x.signum() > 0) { + if ((i = x.getLowestSetBit()) > 0) x.rShiftTo(i, x) + if ((i = y.getLowestSetBit()) > 0) y.rShiftTo(i, y) + if (x.compareTo(y) >= 0) { + x.subTo(y, x) + x.rShiftTo(1, x) + } else { + y.subTo(x, y) + y.rShiftTo(1, y) + } + } + if (g > 0) y.lShiftTo(g, y) + return y +} + +// (protected) this % n, n < 2^26 +function bnpModInt(n) { + var this_array = this.array + if (n <= 0) return 0 + var d = BI_DV % n, + r = this.s < 0 ? n - 1 : 0 + if (this.t > 0) + if (d == 0) r = this_array[0] % n + else for (var i = this.t - 1; i >= 0; --i) r = (d * r + this_array[i]) % n + return r +} + +// (public) 1/this % m (HAC 14.61) +function bnModInverse(m) { + var ac = m.isEven() + if ((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO + var u = m.clone(), + v = this.clone() + var a = nbv(1), + b = nbv(0), + c = nbv(0), + d = nbv(1) + while (u.signum() != 0) { + while (u.isEven()) { + u.rShiftTo(1, u) + if (ac) { + if (!a.isEven() || !b.isEven()) { + a.addTo(this, a) + b.subTo(m, b) + } + a.rShiftTo(1, a) + } else if (!b.isEven()) b.subTo(m, b) + b.rShiftTo(1, b) + } + while (v.isEven()) { + v.rShiftTo(1, v) + if (ac) { + if (!c.isEven() || !d.isEven()) { + c.addTo(this, c) + d.subTo(m, d) + } + c.rShiftTo(1, c) + } else if (!d.isEven()) d.subTo(m, d) + d.rShiftTo(1, d) + } + if (u.compareTo(v) >= 0) { + u.subTo(v, u) + if (ac) a.subTo(c, a) + b.subTo(d, b) + } else { + v.subTo(u, v) + if (ac) c.subTo(a, c) + d.subTo(b, d) + } + } + if (v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO + if (d.compareTo(m) >= 0) return d.subtract(m) + if (d.signum() < 0) d.addTo(m, d) + else return d + if (d.signum() < 0) return d.add(m) + else return d +} + +var lowprimes = [ + 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, + 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, + 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, + 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, + 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, + 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, + 509, +] +var lplim = (1 << 26) / lowprimes[lowprimes.length - 1] + +// (public) test primality with certainty >= 1-.5^t +function bnIsProbablePrime(t) { + var i, + x = this.abs() + var x_array = x.array + if (x.t == 1 && x_array[0] <= lowprimes[lowprimes.length - 1]) { + for (i = 0; i < lowprimes.length; ++i) + if (x_array[0] == lowprimes[i]) return true + return false + } + if (x.isEven()) return false + i = 1 + while (i < lowprimes.length) { + var m = lowprimes[i], + j = i + 1 + while (j < lowprimes.length && m < lplim) m *= lowprimes[j++] + m = x.modInt(m) + while (i < j) if (m % lowprimes[i++] == 0) return false + } + return x.millerRabin(t) +} + +// (protected) true if probably prime (HAC 4.24, Miller-Rabin) +function bnpMillerRabin(t) { + var n1 = this.subtract(BigInteger.ONE) + var k = n1.getLowestSetBit() + if (k <= 0) return false + var r = n1.shiftRight(k) + t = (t + 1) >> 1 + if (t > lowprimes.length) t = lowprimes.length + var a = nbi() + for (var i = 0; i < t; ++i) { + a.fromInt(lowprimes[i]) + var y = a.modPow(r, this) + if (y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) { + var j = 1 + while (j++ < k && y.compareTo(n1) != 0) { + y = y.modPowInt(2, this) + if (y.compareTo(BigInteger.ONE) == 0) return false + } + if (y.compareTo(n1) != 0) return false + } + } + return true +} + +// protected +BigInteger.prototype.chunkSize = bnpChunkSize +BigInteger.prototype.toRadix = bnpToRadix +BigInteger.prototype.fromRadix = bnpFromRadix +BigInteger.prototype.fromNumber = bnpFromNumber +BigInteger.prototype.bitwiseTo = bnpBitwiseTo +BigInteger.prototype.changeBit = bnpChangeBit +BigInteger.prototype.addTo = bnpAddTo +BigInteger.prototype.dMultiply = bnpDMultiply +BigInteger.prototype.dAddOffset = bnpDAddOffset +BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo +BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo +BigInteger.prototype.modInt = bnpModInt +BigInteger.prototype.millerRabin = bnpMillerRabin + +// public +BigInteger.prototype.clone = bnClone +BigInteger.prototype.intValue = bnIntValue +BigInteger.prototype.byteValue = bnByteValue +BigInteger.prototype.shortValue = bnShortValue +BigInteger.prototype.signum = bnSigNum +BigInteger.prototype.toByteArray = bnToByteArray +BigInteger.prototype.equals = bnEquals +BigInteger.prototype.min = bnMin +BigInteger.prototype.max = bnMax +BigInteger.prototype.and = bnAnd +BigInteger.prototype.or = bnOr +BigInteger.prototype.xor = bnXor +BigInteger.prototype.andNot = bnAndNot +BigInteger.prototype.not = bnNot +BigInteger.prototype.shiftLeft = bnShiftLeft +BigInteger.prototype.shiftRight = bnShiftRight +BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit +BigInteger.prototype.bitCount = bnBitCount +BigInteger.prototype.testBit = bnTestBit +BigInteger.prototype.setBit = bnSetBit +BigInteger.prototype.clearBit = bnClearBit +BigInteger.prototype.flipBit = bnFlipBit +BigInteger.prototype.add = bnAdd +BigInteger.prototype.subtract = bnSubtract +BigInteger.prototype.multiply = bnMultiply +BigInteger.prototype.divide = bnDivide +BigInteger.prototype.remainder = bnRemainder +BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder +BigInteger.prototype.modPow = bnModPow +BigInteger.prototype.modInverse = bnModInverse +BigInteger.prototype.pow = bnPow +BigInteger.prototype.gcd = bnGCD +BigInteger.prototype.isProbablePrime = bnIsProbablePrime + +// BigInteger interfaces not implemented in jsbn: + +// BigInteger(int signum, byte[] magnitude) +// double doubleValue() +// float floatValue() +// int hashCode() +// long longValue() +// static BigInteger valueOf(long val) +// prng4.js - uses Arcfour as a PRNG + +function Arcfour() { + this.i = 0 + this.j = 0 + this.S = new Array() +} + +// Initialize arcfour context from key, an array of ints, each from [0..255] +function ARC4init(key) { + var i, j, t + for (i = 0; i < 256; ++i) this.S[i] = i + j = 0 + for (i = 0; i < 256; ++i) { + j = (j + this.S[i] + key[i % key.length]) & 255 + t = this.S[i] + this.S[i] = this.S[j] + this.S[j] = t + } + this.i = 0 + this.j = 0 +} + +function ARC4next() { + var t + this.i = (this.i + 1) & 255 + this.j = (this.j + this.S[this.i]) & 255 + t = this.S[this.i] + this.S[this.i] = this.S[this.j] + this.S[this.j] = t + return this.S[(t + this.S[this.i]) & 255] +} + +Arcfour.prototype.init = ARC4init +Arcfour.prototype.next = ARC4next + +// Plug in your RNG constructor here +function prng_newstate() { + return new Arcfour() +} + +// Pool size must be a multiple of 4 and greater than 32. +// An array of bytes the size of the pool will be passed to init() +var rng_psize = 256 +// Random number generator - requires a PRNG backend, e.g. prng4.js + +// For best results, put code like +// +// in your main HTML document. + +var rng_state +var rng_pool +var rng_pptr + +// Mix in a 32-bit integer into the pool +function rng_seed_int(x) { + rng_pool[rng_pptr++] ^= x & 255 + rng_pool[rng_pptr++] ^= (x >> 8) & 255 + rng_pool[rng_pptr++] ^= (x >> 16) & 255 + rng_pool[rng_pptr++] ^= (x >> 24) & 255 + if (rng_pptr >= rng_psize) rng_pptr -= rng_psize +} + +// Mix in the current time (w/milliseconds) into the pool +function rng_seed_time() { + // Use pre-computed date to avoid making the benchmark + // results dependent on the current date. + rng_seed_int(1122926989487) +} + +// Initialize the pool with junk if needed. +if (rng_pool == null) { + rng_pool = new Array() + rng_pptr = 0 + var t + while (rng_pptr < rng_psize) { + // extract some randomness from Math.random() + t = Math.floor(65536 * Math.random()) + rng_pool[rng_pptr++] = t >>> 8 + rng_pool[rng_pptr++] = t & 255 + } + rng_pptr = 0 + rng_seed_time() + //rng_seed_int(window.screenX); + //rng_seed_int(window.screenY); +} + +function rng_get_byte() { + if (rng_state == null) { + rng_seed_time() + rng_state = prng_newstate() + rng_state.init(rng_pool) + for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) + rng_pool[rng_pptr] = 0 + rng_pptr = 0 + //rng_pool = null; + } + // TODO: allow reseeding after first request + return rng_state.next() +} + +function rng_get_bytes(ba) { + var i + for (i = 0; i < ba.length; ++i) ba[i] = rng_get_byte() +} + +function SecureRandom() {} + +SecureRandom.prototype.nextBytes = rng_get_bytes +// Depends on jsbn.js and rng.js + +// convert a (hex) string to a bignum object +function parseBigInt(str, r) { + return new BigInteger(str, r) +} + +function linebrk(s, n) { + var ret = '' + var i = 0 + while (i + n < s.length) { + ret += s.substring(i, i + n) + '\n' + i += n + } + return ret + s.substring(i, s.length) +} + +function byte2Hex(b) { + if (b < 0x10) return '0' + b.toString(16) + else return b.toString(16) +} + +// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint +function pkcs1pad2(s, n) { + if (n < s.length + 11) { + alert('Message too long for RSA') + return null + } + var ba = new Array() + var i = s.length - 1 + while (i >= 0 && n > 0) ba[--n] = s.charCodeAt(i--) + ba[--n] = 0 + var rng = new SecureRandom() + var x = new Array() + while (n > 2) { + // random non-zero pad + x[0] = 0 + while (x[0] == 0) rng.nextBytes(x) + ba[--n] = x[0] + } + ba[--n] = 2 + ba[--n] = 0 + return new BigInteger(ba) +} + +// "empty" RSA key constructor +function RSAKey() { + this.n = null + this.e = 0 + this.d = null + this.p = null + this.q = null + this.dmp1 = null + this.dmq1 = null + this.coeff = null +} + +// Set the public key fields N and e from hex strings +function RSASetPublic(N, E) { + if (N != null && E != null && N.length > 0 && E.length > 0) { + this.n = parseBigInt(N, 16) + this.e = parseInt(E, 16) + } else alert('Invalid RSA public key') +} + +// Perform raw public operation on "x": return x^e (mod n) +function RSADoPublic(x) { + return x.modPowInt(this.e, this.n) +} + +// Return the PKCS#1 RSA encryption of "text" as an even-length hex string +function RSAEncrypt(text) { + var m = pkcs1pad2(text, (this.n.bitLength() + 7) >> 3) + if (m == null) return null + var c = this.doPublic(m) + if (c == null) return null + var h = c.toString(16) + if ((h.length & 1) == 0) return h + else return '0' + h +} + +// Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string +//function RSAEncryptB64(text) { +// var h = this.encrypt(text); +// if(h) return hex2b64(h); else return null; +//} + +// protected +RSAKey.prototype.doPublic = RSADoPublic + +// public +RSAKey.prototype.setPublic = RSASetPublic +RSAKey.prototype.encrypt = RSAEncrypt +//RSAKey.prototype.encrypt_b64 = RSAEncryptB64; +// Depends on rsa.js and jsbn2.js + +// Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext +function pkcs1unpad2(d, n) { + var b = d.toByteArray() + var i = 0 + while (i < b.length && b[i] == 0) ++i + if (b.length - i != n - 1 || b[i] != 2) return null + ++i + while (b[i] != 0) if (++i >= b.length) return null + var ret = '' + while (++i < b.length) ret += String.fromCharCode(b[i]) + return ret +} + +// Set the private key fields N, e, and d from hex strings +function RSASetPrivate(N, E, D) { + if (N != null && E != null && N.length > 0 && E.length > 0) { + this.n = parseBigInt(N, 16) + this.e = parseInt(E, 16) + this.d = parseBigInt(D, 16) + } else alert('Invalid RSA private key') +} + +// Set the private key fields N, e, d and CRT params from hex strings +function RSASetPrivateEx(N, E, D, P, Q, DP, DQ, C) { + if (N != null && E != null && N.length > 0 && E.length > 0) { + this.n = parseBigInt(N, 16) + this.e = parseInt(E, 16) + this.d = parseBigInt(D, 16) + this.p = parseBigInt(P, 16) + this.q = parseBigInt(Q, 16) + this.dmp1 = parseBigInt(DP, 16) + this.dmq1 = parseBigInt(DQ, 16) + this.coeff = parseBigInt(C, 16) + } else alert('Invalid RSA private key') +} + +// Generate a new random private key B bits long, using public expt E +function RSAGenerate(B, E) { + var rng = new SecureRandom() + var qs = B >> 1 + this.e = parseInt(E, 16) + var ee = new BigInteger(E, 16) + for (;;) { + for (;;) { + this.p = new BigInteger(B - qs, 1, rng) + if ( + this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == + 0 && + this.p.isProbablePrime(10) + ) + break + } + for (;;) { + this.q = new BigInteger(qs, 1, rng) + if ( + this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == + 0 && + this.q.isProbablePrime(10) + ) + break + } + if (this.p.compareTo(this.q) <= 0) { + var t = this.p + this.p = this.q + this.q = t + } + var p1 = this.p.subtract(BigInteger.ONE) + var q1 = this.q.subtract(BigInteger.ONE) + var phi = p1.multiply(q1) + if (phi.gcd(ee).compareTo(BigInteger.ONE) == 0) { + this.n = this.p.multiply(this.q) + this.d = ee.modInverse(phi) + this.dmp1 = this.d.mod(p1) + this.dmq1 = this.d.mod(q1) + this.coeff = this.q.modInverse(this.p) + break + } + } +} + +// Perform raw private operation on "x": return x^d (mod n) +function RSADoPrivate(x) { + if (this.p == null || this.q == null) return x.modPow(this.d, this.n) + + // TODO: re-calculate any missing CRT params + var xp = x.mod(this.p).modPow(this.dmp1, this.p) + var xq = x.mod(this.q).modPow(this.dmq1, this.q) + + while (xp.compareTo(xq) < 0) xp = xp.add(this.p) + return xp + .subtract(xq) + .multiply(this.coeff) + .mod(this.p) + .multiply(this.q) + .add(xq) +} + +// Return the PKCS#1 RSA decryption of "ctext". +// "ctext" is an even-length hex string and the output is a plain string. +function RSADecrypt(ctext) { + var c = parseBigInt(ctext, 16) + var m = this.doPrivate(c) + if (m == null) return null + return pkcs1unpad2(m, (this.n.bitLength() + 7) >> 3) +} + +// Return the PKCS#1 RSA decryption of "ctext". +// "ctext" is a Base64-encoded string and the output is a plain string. +//function RSAB64Decrypt(ctext) { +// var h = b64tohex(ctext); +// if(h) return this.decrypt(h); else return null; +//} + +// protected +RSAKey.prototype.doPrivate = RSADoPrivate + +// public +RSAKey.prototype.setPrivate = RSASetPrivate +RSAKey.prototype.setPrivateEx = RSASetPrivateEx +RSAKey.prototype.generate = RSAGenerate +RSAKey.prototype.decrypt = RSADecrypt +//RSAKey.prototype.b64_decrypt = RSAB64Decrypt; + +var nValue = + 'a5261939975948bb7a58dffe5ff54e65f0498f9175f5a09288810b8975871e99af3b5dd94057b0fc07535f5f97444504fa35169d461d0d30cf0192e307727c065168c788771c561a9400fb49175e9e6aa4e23fe11af69e9412dd23b0cb6684c4c2429bce139e848ab26d0829073351f4acd36074eafd036a5eb83359d2a698d3' +var eValue = '10001' +var dValue = + '8e9912f6d3645894e8d38cb58c0db81ff516cf4c7e5a14c7f1eddb1459d2cded4d8d293fc97aee6aefb861859c8b6a3d1dfe710463e1f9ddc72048c09751971c4a580aa51eb523357a3cc48d31cfad1d4a165066ed92d4748fb6571211da5cb14bc11b6e2df7c1a559e6d5ac1cd5c94703a22891464fba23d0d965086277a161' +var pValue = + 'd090ce58a92c75233a6486cb0a9209bf3583b64f540c76f5294bb97d285eed33aec220bde14b2417951178ac152ceab6da7090905b478195498b352048f15e7d' +var qValue = + 'cab575dc652bb66df15a0359609d51d1db184750c00c6698b90ef3465c99655103edbf0d54c56aec0ce3c4d22592338092a126a0cc49f65a4a30d222b411e58f' +var dmp1Value = + '1a24bca8e273df2f0e47c199bbf678604e7df7215480c77c8db39f49b000ce2cf7500038acfff5433b7d582a01f1826e6f4d42e1c57f5e1fef7b12aabc59fd25' +var dmq1Value = + '3d06982efbbe47339e1f6d36b1216b8a741d410b0c662f54f7118b27b9a4ec9d914337eb39841d8666f3034408cf94f5b62f11c402fc994fe15a05493150d9fd' +var coeffValue = + '3a3e731acd8960b7ff9eb81a7ff93bd1cfa74cbd56987db58b4594fb09c09084db1734c8143f98b602b981aaa9243ca28deb69b5b280ee8dcee0fd2625e53250' + +setupEngine(am3, 28) + +var TEXT = + 'The quick brown fox jumped over the extremely lazy frog! ' + + 'Now is the time for all good men to come to the party.' +var encrypted + +function encrypt() { + var RSA = new RSAKey() + RSA.setPublic(nValue, eValue) + RSA.setPrivateEx( + nValue, + eValue, + dValue, + pValue, + qValue, + dmp1Value, + dmq1Value, + coeffValue + ) + encrypted = RSA.encrypt(TEXT) +} + +function decrypt() { + var RSA = new RSAKey() + RSA.setPublic(nValue, eValue) + RSA.setPrivateEx( + nValue, + eValue, + dValue, + pValue, + qValue, + dmp1Value, + dmq1Value, + coeffValue + ) + var decrypted = RSA.decrypt(encrypted) + if (decrypted != TEXT) { + throw new Error('Crypto operation failed') + } +} + +// The code has been adapted for use as a benchmark by Google. +var Crypto = new BenchmarkSuite('Crypto', 266181, [ + new Benchmark('Encrypt', encrypt), + new Benchmark('Decrypt', decrypt), +]) +// The ray tracer code in this file is written by Adam Burmister. It +// is available in its original form from: +// +// http://labs.flog.nz.co/raytracer/ +// +// It has been modified slightly by Google to work as a standalone +// benchmark, but the all the computational code remains +// untouched. This file also contains a copy of parts of the Prototype +// JavaScript framework which is used by the ray tracer. + +// Variable used to hold a number that can be used to verify that +// the scene was ray traced correctly. +var checkNumber + +// ------------------------------------------------------------------------ +// ------------------------------------------------------------------------ + +// The following is a copy of parts of the Prototype JavaScript library: + +// Prototype JavaScript framework, version 1.5.0 +// (c) 2005-2007 Sam Stephenson +// +// Prototype is freely distributable under the terms of an MIT-style license. +// For details, see the Prototype web site: http://prototype.conio.net/ + +var Class = { + create: function () { + return function () { + this.initialize.apply(this, arguments) + } + }, +} + +Object.extend = function (destination, source) { + for (var property in source) { + destination[property] = source[property] + } + return destination +} + +// ------------------------------------------------------------------------ +// ------------------------------------------------------------------------ + +// The rest of this file is the actual ray tracer written by Adam +// Burmister. It's a concatenation of the following files: +// +// flog/color.js +// flog/light.js +// flog/vector.js +// flog/ray.js +// flog/scene.js +// flog/material/basematerial.js +// flog/material/solid.js +// flog/material/chessboard.js +// flog/shape/baseshape.js +// flog/shape/sphere.js +// flog/shape/plane.js +// flog/intersectioninfo.js +// flog/camera.js +// flog/background.js +// flog/engine.js + +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.Color = Class.create() + +Flog.RayTracer.Color.prototype = { + red: 0.0, + green: 0.0, + blue: 0.0, + + initialize: function (r, g, b) { + if (!r) r = 0.0 + if (!g) g = 0.0 + if (!b) b = 0.0 + + this.red = r + this.green = g + this.blue = b + }, + + add: function (c1, c2) { + var result = new Flog.RayTracer.Color(0, 0, 0) + + result.red = c1.red + c2.red + result.green = c1.green + c2.green + result.blue = c1.blue + c2.blue + + return result + }, + + addScalar: function (c1, s) { + var result = new Flog.RayTracer.Color(0, 0, 0) + + result.red = c1.red + s + result.green = c1.green + s + result.blue = c1.blue + s + + result.limit() + + return result + }, + + subtract: function (c1, c2) { + var result = new Flog.RayTracer.Color(0, 0, 0) + + result.red = c1.red - c2.red + result.green = c1.green - c2.green + result.blue = c1.blue - c2.blue + + return result + }, + + multiply: function (c1, c2) { + var result = new Flog.RayTracer.Color(0, 0, 0) + + result.red = c1.red * c2.red + result.green = c1.green * c2.green + result.blue = c1.blue * c2.blue + + return result + }, + + multiplyScalar: function (c1, f) { + var result = new Flog.RayTracer.Color(0, 0, 0) + + result.red = c1.red * f + result.green = c1.green * f + result.blue = c1.blue * f + + return result + }, + + divideFactor: function (c1, f) { + var result = new Flog.RayTracer.Color(0, 0, 0) + + result.red = c1.red / f + result.green = c1.green / f + result.blue = c1.blue / f + + return result + }, + + limit: function () { + this.red = this.red > 0.0 ? (this.red > 1.0 ? 1.0 : this.red) : 0.0 + this.green = this.green > 0.0 ? (this.green > 1.0 ? 1.0 : this.green) : 0.0 + this.blue = this.blue > 0.0 ? (this.blue > 1.0 ? 1.0 : this.blue) : 0.0 + }, + + distance: function (color) { + var d = + Math.abs(this.red - color.red) + + Math.abs(this.green - color.green) + + Math.abs(this.blue - color.blue) + return d + }, + + blend: function (c1, c2, w) { + var result = new Flog.RayTracer.Color(0, 0, 0) + result = Flog.RayTracer.Color.prototype.add( + Flog.RayTracer.Color.prototype.multiplyScalar(c1, 1 - w), + Flog.RayTracer.Color.prototype.multiplyScalar(c2, w) + ) + return result + }, + + brightness: function () { + var r = Math.floor(this.red * 255) + var g = Math.floor(this.green * 255) + var b = Math.floor(this.blue * 255) + return (r * 77 + g * 150 + b * 29) >> 8 + }, + + toString: function () { + var r = Math.floor(this.red * 255) + var g = Math.floor(this.green * 255) + var b = Math.floor(this.blue * 255) + + return 'rgb(' + r + ',' + g + ',' + b + ')' + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.Light = Class.create() + +Flog.RayTracer.Light.prototype = { + position: null, + color: null, + intensity: 10.0, + + initialize: function (pos, color, intensity) { + this.position = pos + this.color = color + this.intensity = intensity ? intensity : 10.0 + }, + + toString: function () { + return ( + 'Light [' + + this.position.x + + ',' + + this.position.y + + ',' + + this.position.z + + ']' + ) + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.Vector = Class.create() + +Flog.RayTracer.Vector.prototype = { + x: 0.0, + y: 0.0, + z: 0.0, + + initialize: function (x, y, z) { + this.x = x ? x : 0 + this.y = y ? y : 0 + this.z = z ? z : 0 + }, + + copy: function (vector) { + this.x = vector.x + this.y = vector.y + this.z = vector.z + }, + + normalize: function () { + var m = this.magnitude() + return new Flog.RayTracer.Vector(this.x / m, this.y / m, this.z / m) + }, + + magnitude: function () { + return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z) + }, + + cross: function (w) { + return new Flog.RayTracer.Vector( + -this.z * w.y + this.y * w.z, + this.z * w.x - this.x * w.z, + -this.y * w.x + this.x * w.y + ) + }, + + dot: function (w) { + return this.x * w.x + this.y * w.y + this.z * w.z + }, + + add: function (v, w) { + return new Flog.RayTracer.Vector(w.x + v.x, w.y + v.y, w.z + v.z) + }, + + subtract: function (v, w) { + if (!w || !v) throw 'Vectors must be defined [' + v + ',' + w + ']' + return new Flog.RayTracer.Vector(v.x - w.x, v.y - w.y, v.z - w.z) + }, + + multiplyVector: function (v, w) { + return new Flog.RayTracer.Vector(v.x * w.x, v.y * w.y, v.z * w.z) + }, + + multiplyScalar: function (v, w) { + return new Flog.RayTracer.Vector(v.x * w, v.y * w, v.z * w) + }, + + toString: function () { + return 'Vector [' + this.x + ',' + this.y + ',' + this.z + ']' + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.Ray = Class.create() + +Flog.RayTracer.Ray.prototype = { + position: null, + direction: null, + initialize: function (pos, dir) { + this.position = pos + this.direction = dir + }, + + toString: function () { + return 'Ray [' + this.position + ',' + this.direction + ']' + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.Scene = Class.create() + +Flog.RayTracer.Scene.prototype = { + camera: null, + shapes: [], + lights: [], + background: null, + + initialize: function () { + this.camera = new Flog.RayTracer.Camera( + new Flog.RayTracer.Vector(0, 0, -5), + new Flog.RayTracer.Vector(0, 0, 1), + new Flog.RayTracer.Vector(0, 1, 0) + ) + this.shapes = new Array() + this.lights = new Array() + this.background = new Flog.RayTracer.Background( + new Flog.RayTracer.Color(0, 0, 0.5), + 0.2 + ) + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} +if (typeof Flog.RayTracer.Material == 'undefined') Flog.RayTracer.Material = {} + +Flog.RayTracer.Material.BaseMaterial = Class.create() + +Flog.RayTracer.Material.BaseMaterial.prototype = { + gloss: 2.0, // [0...infinity] 0 = matt + transparency: 0.0, // 0=opaque + reflection: 0.0, // [0...infinity] 0 = no reflection + refraction: 0.5, + hasTexture: false, + + initialize: function () {}, + + getColor: function (u, v) {}, + + wrapUp: function (t) { + t = t % 2.0 + if (t < -1) t += 2.0 + if (t >= 1) t -= 2.0 + return t + }, + + toString: function () { + return ( + 'Material [gloss=' + + this.gloss + + ', transparency=' + + this.transparency + + ', hasTexture=' + + this.hasTexture + + ']' + ) + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.Material.Solid = Class.create() + +Flog.RayTracer.Material.Solid.prototype = Object.extend( + new Flog.RayTracer.Material.BaseMaterial(), + { + initialize: function (color, reflection, refraction, transparency, gloss) { + this.color = color + this.reflection = reflection + this.transparency = transparency + this.gloss = gloss + this.hasTexture = false + }, + + getColor: function (u, v) { + return this.color + }, + + toString: function () { + return ( + 'SolidMaterial [gloss=' + + this.gloss + + ', transparency=' + + this.transparency + + ', hasTexture=' + + this.hasTexture + + ']' + ) + }, + } +) +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.Material.Chessboard = Class.create() + +Flog.RayTracer.Material.Chessboard.prototype = Object.extend( + new Flog.RayTracer.Material.BaseMaterial(), + { + colorEven: null, + colorOdd: null, + density: 0.5, + + initialize: function ( + colorEven, + colorOdd, + reflection, + transparency, + gloss, + density + ) { + this.colorEven = colorEven + this.colorOdd = colorOdd + this.reflection = reflection + this.transparency = transparency + this.gloss = gloss + this.density = density + this.hasTexture = true + }, + + getColor: function (u, v) { + var t = this.wrapUp(u * this.density) * this.wrapUp(v * this.density) + + if (t < 0.0) return this.colorEven + else return this.colorOdd + }, + + toString: function () { + return ( + 'ChessMaterial [gloss=' + + this.gloss + + ', transparency=' + + this.transparency + + ', hasTexture=' + + this.hasTexture + + ']' + ) + }, + } +) +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} +if (typeof Flog.RayTracer.Shape == 'undefined') Flog.RayTracer.Shape = {} + +Flog.RayTracer.Shape.Sphere = Class.create() + +Flog.RayTracer.Shape.Sphere.prototype = { + initialize: function (pos, radius, material) { + this.radius = radius + this.position = pos + this.material = material + }, + + intersect: function (ray) { + var info = new Flog.RayTracer.IntersectionInfo() + info.shape = this + + var dst = Flog.RayTracer.Vector.prototype.subtract( + ray.position, + this.position + ) + + var B = dst.dot(ray.direction) + var C = dst.dot(dst) - this.radius * this.radius + var D = B * B - C + + if (D > 0) { + // intersection! + info.isHit = true + info.distance = -B - Math.sqrt(D) + info.position = Flog.RayTracer.Vector.prototype.add( + ray.position, + Flog.RayTracer.Vector.prototype.multiplyScalar( + ray.direction, + info.distance + ) + ) + info.normal = Flog.RayTracer.Vector.prototype + .subtract(info.position, this.position) + .normalize() + + info.color = this.material.getColor(0, 0) + } else { + info.isHit = false + } + return info + }, + + toString: function () { + return 'Sphere [position=' + this.position + ', radius=' + this.radius + ']' + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} +if (typeof Flog.RayTracer.Shape == 'undefined') Flog.RayTracer.Shape = {} + +Flog.RayTracer.Shape.Plane = Class.create() + +Flog.RayTracer.Shape.Plane.prototype = { + d: 0.0, + + initialize: function (pos, d, material) { + this.position = pos + this.d = d + this.material = material + }, + + intersect: function (ray) { + var info = new Flog.RayTracer.IntersectionInfo() + + var Vd = this.position.dot(ray.direction) + if (Vd == 0) return info // no intersection + + var t = -(this.position.dot(ray.position) + this.d) / Vd + if (t <= 0) return info + + info.shape = this + info.isHit = true + info.position = Flog.RayTracer.Vector.prototype.add( + ray.position, + Flog.RayTracer.Vector.prototype.multiplyScalar(ray.direction, t) + ) + info.normal = this.position + info.distance = t + + if (this.material.hasTexture) { + var vU = new Flog.RayTracer.Vector( + this.position.y, + this.position.z, + -this.position.x + ) + var vV = vU.cross(this.position) + var u = info.position.dot(vU) + var v = info.position.dot(vV) + info.color = this.material.getColor(u, v) + } else { + info.color = this.material.getColor(0, 0) + } + + return info + }, + + toString: function () { + return 'Plane [' + this.position + ', d=' + this.d + ']' + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.IntersectionInfo = Class.create() + +Flog.RayTracer.IntersectionInfo.prototype = { + isHit: false, + hitCount: 0, + shape: null, + position: null, + normal: null, + color: null, + distance: null, + + initialize: function () { + this.color = new Flog.RayTracer.Color(0, 0, 0) + }, + + toString: function () { + return 'Intersection [' + this.position + ']' + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.Camera = Class.create() + +Flog.RayTracer.Camera.prototype = { + position: null, + lookAt: null, + equator: null, + up: null, + screen: null, + + initialize: function (pos, lookAt, up) { + this.position = pos + this.lookAt = lookAt + this.up = up + this.equator = lookAt.normalize().cross(this.up) + this.screen = Flog.RayTracer.Vector.prototype.add( + this.position, + this.lookAt + ) + }, + + getRay: function (vx, vy) { + var pos = Flog.RayTracer.Vector.prototype.subtract( + this.screen, + Flog.RayTracer.Vector.prototype.subtract( + Flog.RayTracer.Vector.prototype.multiplyScalar(this.equator, vx), + Flog.RayTracer.Vector.prototype.multiplyScalar(this.up, vy) + ) + ) + pos.y = pos.y * -1 + var dir = Flog.RayTracer.Vector.prototype.subtract(pos, this.position) + + var ray = new Flog.RayTracer.Ray(pos, dir.normalize()) + + return ray + }, + + toString: function () { + return 'Ray []' + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.Background = Class.create() + +Flog.RayTracer.Background.prototype = { + color: null, + ambience: 0.0, + + initialize: function (color, ambience) { + this.color = color + this.ambience = ambience + }, +} +/* Fake a Flog.* namespace */ +if (typeof Flog == 'undefined') var Flog = {} +if (typeof Flog.RayTracer == 'undefined') Flog.RayTracer = {} + +Flog.RayTracer.Engine = Class.create() + +Flog.RayTracer.Engine.prototype = { + canvas: null /* 2d context we can render to */, + + initialize: function (options) { + this.options = Object.extend( + { + canvasHeight: 100, + canvasWidth: 100, + pixelWidth: 2, + pixelHeight: 2, + renderDiffuse: false, + renderShadows: false, + renderHighlights: false, + renderReflections: false, + rayDepth: 2, + }, + options || {} + ) + + this.options.canvasHeight /= this.options.pixelHeight + this.options.canvasWidth /= this.options.pixelWidth + + /* TODO: dynamically include other scripts */ + }, + + setPixel: function (x, y, color) { + var pxW, pxH + pxW = this.options.pixelWidth + pxH = this.options.pixelHeight + + if (this.canvas) { + this.canvas.fillStyle = color.toString() + this.canvas.fillRect(x * pxW, y * pxH, pxW, pxH) + } else { + if (x === y) { + checkNumber += color.brightness() + } + // print(x * pxW, y * pxH, pxW, pxH); + } + }, + + renderScene: function (scene, canvas) { + checkNumber = 0 + /* Get canvas */ + if (canvas) { + this.canvas = canvas.getContext('2d') + } else { + this.canvas = null + } + + var canvasHeight = this.options.canvasHeight + var canvasWidth = this.options.canvasWidth + + for (var y = 0; y < canvasHeight; y++) { + for (var x = 0; x < canvasWidth; x++) { + var yp = ((y * 1.0) / canvasHeight) * 2 - 1 + var xp = ((x * 1.0) / canvasWidth) * 2 - 1 + + var ray = scene.camera.getRay(xp, yp) + + var color = this.getPixelColor(ray, scene) + + this.setPixel(x, y, color) + } + } + if (checkNumber !== 2321) { + throw new Error('Scene rendered incorrectly') + } + }, + + getPixelColor: function (ray, scene) { + var info = this.testIntersection(ray, scene, null) + if (info.isHit) { + var color = this.rayTrace(info, ray, scene, 0) + return color + } + return scene.background.color + }, + + testIntersection: function (ray, scene, exclude) { + var hits = 0 + var best = new Flog.RayTracer.IntersectionInfo() + best.distance = 2000 + + for (var i = 0; i < scene.shapes.length; i++) { + var shape = scene.shapes[i] + + if (shape != exclude) { + var info = shape.intersect(ray) + if (info.isHit && info.distance >= 0 && info.distance < best.distance) { + best = info + hits++ + } + } + } + best.hitCount = hits + return best + }, + + getReflectionRay: function (P, N, V) { + var c1 = -N.dot(V) + var R1 = Flog.RayTracer.Vector.prototype.add( + Flog.RayTracer.Vector.prototype.multiplyScalar(N, 2 * c1), + V + ) + return new Flog.RayTracer.Ray(P, R1) + }, + + rayTrace: function (info, ray, scene, depth) { + // Calc ambient + var color = Flog.RayTracer.Color.prototype.multiplyScalar( + info.color, + scene.background.ambience + ) + var oldColor = color + var shininess = Math.pow(10, info.shape.material.gloss + 1) + + for (var i = 0; i < scene.lights.length; i++) { + var light = scene.lights[i] + + // Calc diffuse lighting + var v = Flog.RayTracer.Vector.prototype + .subtract(light.position, info.position) + .normalize() + + if (this.options.renderDiffuse) { + var L = v.dot(info.normal) + if (L > 0.0) { + color = Flog.RayTracer.Color.prototype.add( + color, + Flog.RayTracer.Color.prototype.multiply( + info.color, + Flog.RayTracer.Color.prototype.multiplyScalar(light.color, L) + ) + ) + } + } + + // The greater the depth the more accurate the colours, but + // this is exponentially (!) expensive + if (depth <= this.options.rayDepth) { + // calculate reflection ray + if ( + this.options.renderReflections && + info.shape.material.reflection > 0 + ) { + var reflectionRay = this.getReflectionRay( + info.position, + info.normal, + ray.direction + ) + var refl = this.testIntersection(reflectionRay, scene, info.shape) + + if (refl.isHit && refl.distance > 0) { + refl.color = this.rayTrace(refl, reflectionRay, scene, depth + 1) + } else { + refl.color = scene.background.color + } + + color = Flog.RayTracer.Color.prototype.blend( + color, + refl.color, + info.shape.material.reflection + ) + } + + // Refraction + /* TODO */ + } + + /* Render shadows and highlights */ + + var shadowInfo = new Flog.RayTracer.IntersectionInfo() + + if (this.options.renderShadows) { + var shadowRay = new Flog.RayTracer.Ray(info.position, v) + + shadowInfo = this.testIntersection(shadowRay, scene, info.shape) + if ( + shadowInfo.isHit && + shadowInfo.shape != info.shape /*&& shadowInfo.shape.type != 'PLANE'*/ + ) { + var vA = Flog.RayTracer.Color.prototype.multiplyScalar(color, 0.5) + var dB = 0.5 * Math.pow(shadowInfo.shape.material.transparency, 0.5) + color = Flog.RayTracer.Color.prototype.addScalar(vA, dB) + } + } + + // Phong specular highlights + if ( + this.options.renderHighlights && + !shadowInfo.isHit && + info.shape.material.gloss > 0 + ) { + var Lv = Flog.RayTracer.Vector.prototype + .subtract(info.shape.position, light.position) + .normalize() + + var E = Flog.RayTracer.Vector.prototype + .subtract(scene.camera.position, info.shape.position) + .normalize() + + var H = Flog.RayTracer.Vector.prototype.subtract(E, Lv).normalize() + + var glossWeight = Math.pow(Math.max(info.normal.dot(H), 0), shininess) + color = Flog.RayTracer.Color.prototype.add( + Flog.RayTracer.Color.prototype.multiplyScalar( + light.color, + glossWeight + ), + color + ) + } + } + color.limit() + return color + }, +} + +function renderScene() { + var scene = new Flog.RayTracer.Scene() + + scene.camera = new Flog.RayTracer.Camera( + new Flog.RayTracer.Vector(0, 0, -15), + new Flog.RayTracer.Vector(-0.2, 0, 5), + new Flog.RayTracer.Vector(0, 1, 0) + ) + + scene.background = new Flog.RayTracer.Background( + new Flog.RayTracer.Color(0.5, 0.5, 0.5), + 0.4 + ) + + var sphere = new Flog.RayTracer.Shape.Sphere( + new Flog.RayTracer.Vector(-1.5, 1.5, 2), + 1.5, + new Flog.RayTracer.Material.Solid( + new Flog.RayTracer.Color(0, 0.5, 0.5), + 0.3, + 0.0, + 0.0, + 2.0 + ) + ) + + var sphere1 = new Flog.RayTracer.Shape.Sphere( + new Flog.RayTracer.Vector(1, 0.25, 1), + 0.5, + new Flog.RayTracer.Material.Solid( + new Flog.RayTracer.Color(0.9, 0.9, 0.9), + 0.1, + 0.0, + 0.0, + 1.5 + ) + ) + + var plane = new Flog.RayTracer.Shape.Plane( + new Flog.RayTracer.Vector(0.1, 0.9, -0.5).normalize(), + 1.2, + new Flog.RayTracer.Material.Chessboard( + new Flog.RayTracer.Color(1, 1, 1), + new Flog.RayTracer.Color(0, 0, 0), + 0.2, + 0.0, + 1.0, + 0.7 + ) + ) + + scene.shapes.push(plane) + scene.shapes.push(sphere) + scene.shapes.push(sphere1) + + var light = new Flog.RayTracer.Light( + new Flog.RayTracer.Vector(5, 10, -1), + new Flog.RayTracer.Color(0.8, 0.8, 0.8) + ) + + var light1 = new Flog.RayTracer.Light( + new Flog.RayTracer.Vector(-3, 5, -15), + new Flog.RayTracer.Color(0.8, 0.8, 0.8), + 100 + ) + + scene.lights.push(light) + scene.lights.push(light1) + + var imageWidth = 100 // $F('imageWidth'); + var imageHeight = 100 // $F('imageHeight'); + var pixelSize = '5,5'.split(',') // $F('pixelSize').split(','); + var renderDiffuse = true // $F('renderDiffuse'); + var renderShadows = true // $F('renderShadows'); + var renderHighlights = true // $F('renderHighlights'); + var renderReflections = true // $F('renderReflections'); + var rayDepth = 2 //$F('rayDepth'); + + var raytracer = new Flog.RayTracer.Engine({ + canvasWidth: imageWidth, + canvasHeight: imageHeight, + pixelWidth: pixelSize[0], + pixelHeight: pixelSize[1], + renderDiffuse: renderDiffuse, + renderHighlights: renderHighlights, + renderShadows: renderShadows, + renderReflections: renderReflections, + rayDepth: rayDepth, + }) + + raytracer.renderScene(scene, null, 0) +} + +var RayTrace = new BenchmarkSuite('RayTrace', 739989, [ + new Benchmark('RayTrace', renderScene), +]) + +// This file is automatically generated by scheme2js, except for the +// benchmark harness code at the beginning and end of the file. + +/************* GENERATED FILE - DO NOT EDIT *************/ +/************* GENERATED FILE - DO NOT EDIT *************/ +/************* GENERATED FILE - DO NOT EDIT *************/ +/************* GENERATED FILE - DO NOT EDIT *************/ +/************* GENERATED FILE - DO NOT EDIT *************/ +/************* GENERATED FILE - DO NOT EDIT *************/ +/************* GENERATED FILE - DO NOT EDIT *************/ +/************* GENERATED FILE - DO NOT EDIT *************/ +/* + * To use write/prints/... the default-output port has to be set first. + * Simply setting SC_DEFAULT_OUT and SC_ERROR_OUT to the desired values + * should do the trick. + * In the following example the std-out and error-port are redirected to + * a DIV. +function initRuntime() { + function escapeHTML(s) { + var tmp = s; + tmp = tmp.replace(/&/g, "&"); + tmp = tmp.replace(//g, ">"); + tmp = tmp.replace(/ /g, " "); + tmp = tmp.replace(/\n/g, "
"); + tmp = tmp.replace(/\t/g, "    "); + return tmp; + + } + + document.write("
"); + SC_DEFAULT_OUT = new sc_GenericOutputPort( + function(s) { + var stdout = document.getElementById('stdout'); + stdout.innerHTML = stdout.innerHTML + escapeHTML(s); + }); + SC_ERROR_OUT = SC_DEFAULT_OUT; +} +*/ + +function sc_print_debug() { + sc_print.apply(null, arguments) +} +/*** META ((export *js*)) */ +var sc_JS_GLOBALS = this + +var __sc_LINE = -1 +var __sc_FILE = '' + +/*** META ((export #t)) */ +function sc_alert() { + var len = arguments.length + var s = '' + var i + + for (i = 0; i < len; i++) { + s += sc_toDisplayString(arguments[i]) + } + + return alert(s) +} + +/*** META ((export #t)) */ +function sc_typeof(x) { + return typeof x +} + +/*** META ((export #t)) */ +function sc_error() { + var a = [sc_jsstring2symbol('*error*')] + for (var i = 0; i < arguments.length; i++) { + a[i + 1] = arguments[i] + } + throw a +} + +/*** META ((export #t) + (peephole (prefix "throw "))) +*/ +function sc_raise(obj) { + throw obj +} + +/*** META ((export with-handler-lambda)) */ +function sc_withHandlerLambda(handler, body) { + try { + return body() + } catch (e) { + if (!e._internalException) return handler(e) + else throw e + } +} + +var sc_properties = new Object() + +/*** META ((export #t)) */ +function sc_putpropBang(sym, key, val) { + var ht = sc_properties[sym] + if (!ht) { + ht = new Object() + sc_properties[sym] = ht + } + ht[key] = val +} + +/*** META ((export #t)) */ +function sc_getprop(sym, key) { + var ht = sc_properties[sym] + if (ht) { + if (key in ht) return ht[key] + else return false + } else return false +} + +/*** META ((export #t)) */ +function sc_rempropBang(sym, key) { + var ht = sc_properties[sym] + if (ht) delete ht[key] +} + +/*** META ((export #t)) */ +function sc_any2String(o) { + return jsstring2string(sc_toDisplayString(o)) +} + +/*** META ((export #t) + (peephole (infix 2 2 "===")) + (type bool)) +*/ +function sc_isEqv(o1, o2) { + return o1 === o2 +} + +/*** META ((export #t) + (peephole (infix 2 2 "===")) + (type bool)) +*/ +function sc_isEq(o1, o2) { + return o1 === o2 +} + +/*** META ((export #t) + (type bool)) +*/ +function sc_isNumber(n) { + return typeof n === 'number' +} + +/*** META ((export #t) + (type bool)) +*/ +function sc_isComplex(n) { + return sc_isNumber(n) +} + +/*** META ((export #t) + (type bool)) +*/ +function sc_isReal(n) { + return sc_isNumber(n) +} + +/*** META ((export #t) + (type bool)) +*/ +function sc_isRational(n) { + return sc_isReal(n) +} + +/*** META ((export #t) + (type bool)) +*/ +function sc_isInteger(n) { + return parseInt(n) === n +} + +/*** META ((export #t) + (type bool) + (peephole (postfix ", false"))) +*/ +// we don't have exact numbers... +function sc_isExact(n) { + return false +} + +/*** META ((export #t) + (peephole (postfix ", true")) + (type bool)) +*/ +function sc_isInexact(n) { + return true +} + +/*** META ((export = =fx =fl) + (type bool) + (peephole (infix 2 2 "==="))) +*/ +function sc_equal(x) { + for (var i = 1; i < arguments.length; i++) + if (x !== arguments[i]) return false + return true +} + +/*** META ((export < = arguments[i]) return false + x = arguments[i] + } + return true +} + +/*** META ((export > >fx >fl) + (type bool) + (peephole (infix 2 2 ">"))) +*/ +function sc_greater(x, y) { + for (var i = 1; i < arguments.length; i++) { + if (x <= arguments[i]) return false + x = arguments[i] + } + return true +} + +/*** META ((export <= <=fx <=fl) + (type bool) + (peephole (infix 2 2 "<="))) +*/ +function sc_lessEqual(x, y) { + for (var i = 1; i < arguments.length; i++) { + if (x > arguments[i]) return false + x = arguments[i] + } + return true +} + +/*** META ((export >= >=fl >=fx) + (type bool) + (peephole (infix 2 2 ">="))) +*/ +function sc_greaterEqual(x, y) { + for (var i = 1; i < arguments.length; i++) { + if (x < arguments[i]) return false + x = arguments[i] + } + return true +} + +/*** META ((export #t) + (type bool) + (peephole (postfix "=== 0"))) +*/ +function sc_isZero(x) { + return x === 0 +} + +/*** META ((export #t) + (type bool) + (peephole (postfix "> 0"))) +*/ +function sc_isPositive(x) { + return x > 0 +} + +/*** META ((export #t) + (type bool) + (peephole (postfix "< 0"))) +*/ +function sc_isNegative(x) { + return x < 0 +} + +/*** META ((export #t) + (type bool) + (peephole (postfix "%2===1"))) +*/ +function sc_isOdd(x) { + return x % 2 === 1 +} + +/*** META ((export #t) + (type bool) + (peephole (postfix "%2===0"))) +*/ +function sc_isEven(x) { + return x % 2 === 0 +} + +/*** META ((export #t)) */ +var sc_max = Math.max +/*** META ((export #t)) */ +var sc_min = Math.min + +/*** META ((export + +fx +fl) + (peephole (infix 0 #f "+" "0"))) +*/ +function sc_plus() { + var sum = 0 + for (var i = 0; i < arguments.length; i++) sum += arguments[i] + return sum +} + +/*** META ((export * *fx *fl) + (peephole (infix 0 #f "*" "1"))) +*/ +function sc_multi() { + var product = 1 + for (var i = 0; i < arguments.length; i++) product *= arguments[i] + return product +} + +/*** META ((export - -fx -fl) + (peephole (minus))) +*/ +function sc_minus(x) { + if (arguments.length === 1) return -x + else { + var res = x + for (var i = 1; i < arguments.length; i++) res -= arguments[i] + return res + } +} + +/*** META ((export / /fl) + (peephole (div))) +*/ +function sc_div(x) { + if (arguments.length === 1) return 1 / x + else { + var res = x + for (var i = 1; i < arguments.length; i++) res /= arguments[i] + return res + } +} + +/*** META ((export #t)) */ +var sc_abs = Math.abs + +/*** META ((export quotient /fx) + (peephole (hole 2 "parseInt(" x "/" y ")"))) +*/ +function sc_quotient(x, y) { + return parseInt(x / y) +} + +/*** META ((export #t) + (peephole (infix 2 2 "%"))) +*/ +function sc_remainder(x, y) { + return x % y +} + +/*** META ((export #t) + (peephole (modulo))) +*/ +function sc_modulo(x, y) { + var remainder = x % y + // if they don't have the same sign + if (remainder * y < 0) return remainder + y + else return remainder +} + +function sc_euclid_gcd(a, b) { + var temp + if (a === 0) return b + if (b === 0) return a + if (a < 0) { + a = -a + } + if (b < 0) { + b = -b + } + if (b > a) { + temp = a + a = b + b = temp + } + while (true) { + a %= b + if (a === 0) { + return b + } + b %= a + if (b === 0) { + return a + } + } + return b +} + +/*** META ((export #t)) */ +function sc_gcd() { + var gcd = 0 + for (var i = 0; i < arguments.length; i++) + gcd = sc_euclid_gcd(gcd, arguments[i]) + return gcd +} + +/*** META ((export #t)) */ +function sc_lcm() { + var lcm = 1 + for (var i = 0; i < arguments.length; i++) { + var f = Math.round(arguments[i] / sc_euclid_gcd(arguments[i], lcm)) + lcm *= Math.abs(f) + } + return lcm +} + +// LIMITATION: numerator and denominator don't make sense in floating point world. +//var SC_MAX_DECIMALS = 1000000 +// +// function sc_numerator(x) { +// var rounded = Math.round(x * SC_MAX_DECIMALS); +// return Math.round(rounded / sc_euclid_gcd(rounded, SC_MAX_DECIMALS)); +// } + +// function sc_denominator(x) { +// var rounded = Math.round(x * SC_MAX_DECIMALS); +// return Math.round(SC_MAX_DECIMALS / sc_euclid_gcd(rounded, SC_MAX_DECIMALS)); +// } + +/*** META ((export #t)) */ +var sc_floor = Math.floor +/*** META ((export #t)) */ +var sc_ceiling = Math.ceil +/*** META ((export #t)) */ +var sc_truncate = parseInt +/*** META ((export #t)) */ +var sc_round = Math.round + +// LIMITATION: sc_rationalize doesn't make sense in a floating point world. + +/*** META ((export #t)) */ +var sc_exp = Math.exp +/*** META ((export #t)) */ +var sc_log = Math.log +/*** META ((export #t)) */ +var sc_sin = Math.sin +/*** META ((export #t)) */ +var sc_cos = Math.cos +/*** META ((export #t)) */ +var sc_tan = Math.tan +/*** META ((export #t)) */ +var sc_asin = Math.asin +/*** META ((export #t)) */ +var sc_acos = Math.acos +/*** META ((export #t)) */ +var sc_atan = Math.atan + +/*** META ((export #t)) */ +var sc_sqrt = Math.sqrt +/*** META ((export #t)) */ +var sc_expt = Math.pow + +// LIMITATION: we don't have complex numbers. +// LIMITATION: the following functions are hence not implemented. +// LIMITATION: make-rectangular, make-polar, real-part, imag-part, magnitude, angle +// LIMITATION: 2 argument atan + +/*** META ((export #t) + (peephole (id))) +*/ +function sc_exact2inexact(x) { + return x +} + +/*** META ((export #t) + (peephole (id))) +*/ +function sc_inexact2exact(x) { + return x +} + +function sc_number2jsstring(x, radix) { + if (radix) return x.toString(radix) + else return x.toString() +} + +function sc_jsstring2number(s, radix) { + if (s === '') return false + + if (radix) { + var t = parseInt(s, radix) + if (!t && t !== 0) return false + // verify that each char is in range. (parseInt ignores leading + // white and trailing chars) + var allowedChars = '01234567890abcdefghijklmnopqrstuvwxyz'.substring( + 0, + radix + 1 + ) + if (new RegExp('^[' + allowedChars + ']*$', 'i').test(s)) return t + else return false + } else { + var t = +s // does not ignore trailing chars. + if (!t && t !== 0) return false + // simply verify that first char is not whitespace. + var c = s.charAt(0) + // if +c is 0, but the char is not "0", then we have a whitespace. + if (+c === 0 && c !== '0') return false + return t + } +} + +/*** META ((export #t) + (type bool) + (peephole (not))) +*/ +function sc_not(b) { + return b === false +} + +/*** META ((export #t) + (type bool)) +*/ +function sc_isBoolean(b) { + return b === true || b === false +} + +function sc_Pair(car, cdr) { + this.car = car + this.cdr = cdr +} + +sc_Pair.prototype.toString = function () { + return sc_toDisplayString(this) +} +sc_Pair.prototype.sc_toWriteOrDisplayString = function (writeOrDisplay) { + var current = this + + var res = '(' + + while (true) { + res += writeOrDisplay(current.car) + if (sc_isPair(current.cdr)) { + res += ' ' + current = current.cdr + } else if (current.cdr !== null) { + res += ' . ' + writeOrDisplay(current.cdr) + break + } // current.cdr == null + else break + } + + res += ')' + + return res +} +sc_Pair.prototype.sc_toDisplayString = function () { + return this.sc_toWriteOrDisplayString(sc_toDisplayString) +} +sc_Pair.prototype.sc_toWriteString = function () { + return this.sc_toWriteOrDisplayString(sc_toWriteString) +} +// sc_Pair.prototype.sc_toWriteCircleString in IO.js + +/*** META ((export #t) + (type bool) + (peephole (postfix " instanceof sc_Pair"))) +*/ +function sc_isPair(p) { + return p instanceof sc_Pair +} + +function sc_isPairEqual(p1, p2, comp) { + return comp(p1.car, p2.car) && comp(p1.cdr, p2.cdr) +} + +/*** META ((export #t) + (peephole (hole 2 "new sc_Pair(" car ", " cdr ")"))) +*/ +function sc_cons(car, cdr) { + return new sc_Pair(car, cdr) +} + +/*** META ((export cons*)) */ +function sc_consStar() { + var res = arguments[arguments.length - 1] + for (var i = arguments.length - 2; i >= 0; i--) + res = new sc_Pair(arguments[i], res) + return res +} + +/*** META ((export #t) + (peephole (postfix ".car"))) +*/ +function sc_car(p) { + return p.car +} + +/*** META ((export #t) + (peephole (postfix ".cdr"))) +*/ +function sc_cdr(p) { + return p.cdr +} + +/*** META ((export #t) + (peephole (hole 2 p ".car = " val))) +*/ +function sc_setCarBang(p, val) { + p.car = val +} + +/*** META ((export #t) + (peephole (hole 2 p ".cdr = " val))) +*/ +function sc_setCdrBang(p, val) { + p.cdr = val +} + +/*** META ((export #t) + (peephole (postfix ".car.car"))) +*/ +function sc_caar(p) { + return p.car.car +} +/*** META ((export #t) + (peephole (postfix ".cdr.car"))) +*/ +function sc_cadr(p) { + return p.cdr.car +} +/*** META ((export #t) + (peephole (postfix ".car.cdr"))) +*/ +function sc_cdar(p) { + return p.car.cdr +} +/*** META ((export #t) + (peephole (postfix ".cdr.cdr"))) +*/ +function sc_cddr(p) { + return p.cdr.cdr +} +/*** META ((export #t) + (peephole (postfix ".car.car.car"))) +*/ +function sc_caaar(p) { + return p.car.car.car +} +/*** META ((export #t) + (peephole (postfix ".car.cdr.car"))) +*/ +function sc_cadar(p) { + return p.car.cdr.car +} +/*** META ((export #t) + (peephole (postfix ".cdr.car.car"))) +*/ +function sc_caadr(p) { + return p.cdr.car.car +} +/*** META ((export #t) + (peephole (postfix ".cdr.cdr.car"))) +*/ +function sc_caddr(p) { + return p.cdr.cdr.car +} +/*** META ((export #t) + (peephole (postfix ".car.car.cdr"))) +*/ +function sc_cdaar(p) { + return p.car.car.cdr +} +/*** META ((export #t) + (peephole (postfix ".cdr.car.cdr"))) +*/ +function sc_cdadr(p) { + return p.cdr.car.cdr +} +/*** META ((export #t) + (peephole (postfix ".car.cdr.cdr"))) +*/ +function sc_cddar(p) { + return p.car.cdr.cdr +} +/*** META ((export #t) + (peephole (postfix ".cdr.cdr.cdr"))) +*/ +function sc_cdddr(p) { + return p.cdr.cdr.cdr +} +/*** META ((export #t) + (peephole (postfix ".car.car.car.car"))) +*/ +function sc_caaaar(p) { + return p.car.car.car.car +} +/*** META ((export #t) + (peephole (postfix ".car.cdr.car.car"))) +*/ +function sc_caadar(p) { + return p.car.cdr.car.car +} +/*** META ((export #t) + (peephole (postfix ".cdr.car.car.car"))) +*/ +function sc_caaadr(p) { + return p.cdr.car.car.car +} +/*** META ((export #t) + (peephole (postfix ".cdr.cdr.car.car"))) +*/ +function sc_caaddr(p) { + return p.cdr.cdr.car.car +} +/*** META ((export #t) + (peephole (postfix ".car.car.car.cdr"))) +*/ +function sc_cdaaar(p) { + return p.car.car.car.cdr +} +/*** META ((export #t) + (peephole (postfix ".car.cdr.car.cdr"))) +*/ +function sc_cdadar(p) { + return p.car.cdr.car.cdr +} +/*** META ((export #t) + (peephole (postfix ".cdr.car.car.cdr"))) +*/ +function sc_cdaadr(p) { + return p.cdr.car.car.cdr +} +/*** META ((export #t) + (peephole (postfix ".cdr.cdr.car.cdr"))) +*/ +function sc_cdaddr(p) { + return p.cdr.cdr.car.cdr +} +/*** META ((export #t) + (peephole (postfix ".car.car.cdr.car"))) +*/ +function sc_cadaar(p) { + return p.car.car.cdr.car +} +/*** META ((export #t) + (peephole (postfix ".car.cdr.cdr.car"))) +*/ +function sc_caddar(p) { + return p.car.cdr.cdr.car +} +/*** META ((export #t) + (peephole (postfix ".cdr.car.cdr.car"))) +*/ +function sc_cadadr(p) { + return p.cdr.car.cdr.car +} +/*** META ((export #t) + (peephole (postfix ".cdr.cdr.cdr.car"))) +*/ +function sc_cadddr(p) { + return p.cdr.cdr.cdr.car +} +/*** META ((export #t) + (peephole (postfix ".car.car.cdr.cdr"))) +*/ +function sc_cddaar(p) { + return p.car.car.cdr.cdr +} +/*** META ((export #t) + (peephole (postfix ".car.cdr.cdr.cdr"))) +*/ +function sc_cdddar(p) { + return p.car.cdr.cdr.cdr +} +/*** META ((export #t) + (peephole (postfix ".cdr.car.cdr.cdr"))) +*/ +function sc_cddadr(p) { + return p.cdr.car.cdr.cdr +} +/*** META ((export #t) + (peephole (postfix ".cdr.cdr.cdr.cdr"))) +*/ +function sc_cddddr(p) { + return p.cdr.cdr.cdr.cdr +} + +/*** META ((export #t)) */ +function sc_lastPair(l) { + if (!sc_isPair(l)) sc_error('sc_lastPair: pair expected') + var res = l + var cdr = l.cdr + while (sc_isPair(cdr)) { + res = cdr + cdr = res.cdr + } + return res +} + +/*** META ((export #t) + (type bool) + (peephole (postfix " === null"))) +*/ +function sc_isNull(o) { + return o === null +} + +/*** META ((export #t) + (type bool)) +*/ +function sc_isList(o) { + var rabbit + var turtle + + var rabbit = o + var turtle = o + while (true) { + if (rabbit === null || (rabbit instanceof sc_Pair && rabbit.cdr === null)) + return true // end of list + else if (rabbit instanceof sc_Pair && rabbit.cdr instanceof sc_Pair) { + rabbit = rabbit.cdr.cdr + turtle = turtle.cdr + if (rabbit === turtle) return false // cycle + } else return false // not pair + } +} + +/*** META ((export #t)) */ +function sc_list() { + var res = null + var a = arguments + for (var i = a.length - 1; i >= 0; i--) res = new sc_Pair(a[i], res) + return res +} + +/*** META ((export #t)) */ +function sc_iota(num, init) { + var res = null + if (!init) init = 0 + for (var i = num - 1; i >= 0; i--) res = new sc_Pair(i + init, res) + return res +} + +/*** META ((export #t)) */ +function sc_makeList(nbEls, fill) { + var res = null + for (var i = 0; i < nbEls; i++) res = new sc_Pair(fill, res) + return res +} + +/*** META ((export #t)) */ +function sc_length(l) { + var res = 0 + while (l !== null) { + res++ + l = l.cdr + } + return res +} + +/*** META ((export #t)) */ +function sc_remq(o, l) { + var dummy = { cdr: null } + var tail = dummy + while (l !== null) { + if (l.car !== o) { + tail.cdr = sc_cons(l.car, null) + tail = tail.cdr + } + l = l.cdr + } + return dummy.cdr +} + +/*** META ((export #t)) */ +function sc_remqBang(o, l) { + var dummy = { cdr: null } + var tail = dummy + var needsAssig = true + while (l !== null) { + if (l.car === o) { + needsAssig = true + } else { + if (needsAssig) { + tail.cdr = l + needsAssig = false + } + tail = l + } + l = l.cdr + } + tail.cdr = null + return dummy.cdr +} + +/*** META ((export #t)) */ +function sc_delete(o, l) { + var dummy = { cdr: null } + var tail = dummy + while (l !== null) { + if (!sc_isEqual(l.car, o)) { + tail.cdr = sc_cons(l.car, null) + tail = tail.cdr + } + l = l.cdr + } + return dummy.cdr +} + +/*** META ((export #t)) */ +function sc_deleteBang(o, l) { + var dummy = { cdr: null } + var tail = dummy + var needsAssig = true + while (l !== null) { + if (sc_isEqual(l.car, o)) { + needsAssig = true + } else { + if (needsAssig) { + tail.cdr = l + needsAssig = false + } + tail = l + } + l = l.cdr + } + tail.cdr = null + return dummy.cdr +} + +function sc_reverseAppendBang(l1, l2) { + var res = l2 + while (l1 !== null) { + var tmp = res + res = l1 + l1 = l1.cdr + res.cdr = tmp + } + return res +} + +function sc_dualAppend(l1, l2) { + if (l1 === null) return l2 + if (l2 === null) return l1 + var rev = sc_reverse(l1) + return sc_reverseAppendBang(rev, l2) +} + +/*** META ((export #t)) */ +function sc_append() { + if (arguments.length === 0) return null + var res = arguments[arguments.length - 1] + for (var i = arguments.length - 2; i >= 0; i--) + res = sc_dualAppend(arguments[i], res) + return res +} + +function sc_dualAppendBang(l1, l2) { + if (l1 === null) return l2 + if (l2 === null) return l1 + var tmp = l1 + while (tmp.cdr !== null) tmp = tmp.cdr + tmp.cdr = l2 + return l1 +} + +/*** META ((export #t)) */ +function sc_appendBang() { + var res = null + for (var i = 0; i < arguments.length; i++) + res = sc_dualAppendBang(res, arguments[i]) + return res +} + +/*** META ((export #t)) */ +function sc_reverse(l1) { + var res = null + while (l1 !== null) { + res = sc_cons(l1.car, res) + l1 = l1.cdr + } + return res +} + +/*** META ((export #t)) */ +function sc_reverseBang(l) { + return sc_reverseAppendBang(l, null) +} + +/*** META ((export #t)) */ +function sc_listTail(l, k) { + var res = l + for (var i = 0; i < k; i++) { + res = res.cdr + } + return res +} + +/*** META ((export #t)) */ +function sc_listRef(l, k) { + return sc_listTail(l, k).car +} + +/* // unoptimized generic versions +function sc_memX(o, l, comp) { + while (l != null) { + if (comp(l.car, o)) + return l; + l = l.cdr; + } + return false; +} +function sc_memq(o, l) { return sc_memX(o, l, sc_isEq); } +function sc_memv(o, l) { return sc_memX(o, l, sc_isEqv); } +function sc_member(o, l) { return sc_memX(o, l, sc_isEqual); } +*/ + +/* optimized versions */ +/*** META ((export #t)) */ +function sc_memq(o, l) { + while (l !== null) { + if (l.car === o) return l + l = l.cdr + } + return false +} +/*** META ((export #t)) */ +function sc_memv(o, l) { + while (l !== null) { + if (l.car === o) return l + l = l.cdr + } + return false +} +/*** META ((export #t)) */ +function sc_member(o, l) { + while (l !== null) { + if (sc_isEqual(l.car, o)) return l + l = l.cdr + } + return false +} + +/* // generic unoptimized versions +function sc_assX(o, al, comp) { + while (al != null) { + if (comp(al.car.car, o)) + return al.car; + al = al.cdr; + } + return false; +} +function sc_assq(o, al) { return sc_assX(o, al, sc_isEq); } +function sc_assv(o, al) { return sc_assX(o, al, sc_isEqv); } +function sc_assoc(o, al) { return sc_assX(o, al, sc_isEqual); } +*/ +// optimized versions +/*** META ((export #t)) */ +function sc_assq(o, al) { + while (al !== null) { + if (al.car.car === o) return al.car + al = al.cdr + } + return false +} +/*** META ((export #t)) */ +function sc_assv(o, al) { + while (al !== null) { + if (al.car.car === o) return al.car + al = al.cdr + } + return false +} +/*** META ((export #t)) */ +function sc_assoc(o, al) { + while (al !== null) { + if (sc_isEqual(al.car.car, o)) return al.car + al = al.cdr + } + return false +} + +/* can be used for mutable strings and characters */ +function sc_isCharStringEqual(cs1, cs2) { + return cs1.val === cs2.val +} +function sc_isCharStringLess(cs1, cs2) { + return cs1.val < cs2.val +} +function sc_isCharStringGreater(cs1, cs2) { + return cs1.val > cs2.val +} +function sc_isCharStringLessEqual(cs1, cs2) { + return cs1.val <= cs2.val +} +function sc_isCharStringGreaterEqual(cs1, cs2) { + return cs1.val >= cs2.val +} +function sc_isCharStringCIEqual(cs1, cs2) { + return cs1.val.toLowerCase() === cs2.val.toLowerCase() +} +function sc_isCharStringCILess(cs1, cs2) { + return cs1.val.toLowerCase() < cs2.val.toLowerCase() +} +function sc_isCharStringCIGreater(cs1, cs2) { + return cs1.val.toLowerCase() > cs2.val.toLowerCase() +} +function sc_isCharStringCILessEqual(cs1, cs2) { + return cs1.val.toLowerCase() <= cs2.val.toLowerCase() +} +function sc_isCharStringCIGreaterEqual(cs1, cs2) { + return cs1.val.toLowerCase() >= cs2.val.toLowerCase() +} + +function sc_Char(c) { + var cached = sc_Char.lazy[c] + if (cached) return cached + this.val = c + sc_Char.lazy[c] = this + // add return, so FF does not complain. + return undefined +} +sc_Char.lazy = new Object() +// thanks to Eric +sc_Char.char2readable = { + '\u0000': '#\\null', + '\u0007': '#\\bell', + '\b': '#\\backspace', + '\t': '#\\tab', + '\n': '#\\newline', + '\f': '#\\page', + '\r': '#\\return', + '\u001b': '#\\esc', + ' ': '#\\space', + '\u007f': '#\\delete', + /* poeticless names */ + '\u0001': '#\\soh', + '\u0002': '#\\stx', + '\u0003': '#\\etx', + '\u0004': '#\\eot', + '\u0005': '#\\enq', + '\u0006': '#\\ack', + '\u000b': '#\\vt', + '\u000e': '#\\so', + '\u000f': '#\\si', + '\u0010': '#\\dle', + '\u0011': '#\\dc1', + '\u0012': '#\\dc2', + '\u0013': '#\\dc3', + '\u0014': '#\\dc4', + '\u0015': '#\\nak', + '\u0016': '#\\syn', + '\u0017': '#\\etb', + '\u0018': '#\\can', + '\u0019': '#\\em', + '\u001a': '#\\sub', + '\u001c': '#\\fs', + '\u001d': '#\\gs', + '\u001e': '#\\rs', + '\u001f': '#\\us', +} + +sc_Char.readable2char = { + null: '\u0000', + bell: '\u0007', + backspace: '\b', + tab: '\t', + newline: '\n', + page: '\f', + return: '\r', + escape: '\u001b', + space: ' ', + delete: '\u0000', + soh: '\u0001', + stx: '\u0002', + etx: '\u0003', + eot: '\u0004', + enq: '\u0005', + ack: '\u0006', + bel: '\u0007', + bs: '\b', + ht: '\t', + nl: '\n', + vt: '\u000b', + np: '\f', + cr: '\r', + so: '\u000e', + si: '\u000f', + dle: '\u0010', + dc1: '\u0011', + dc2: '\u0012', + dc3: '\u0013', + dc4: '\u0014', + nak: '\u0015', + syn: '\u0016', + etb: '\u0017', + can: '\u0018', + em: '\u0019', + sub: '\u001a', + esc: '\u001b', + fs: '\u001c', + gs: '\u001d', + rs: '\u001e', + us: '\u001f', + sp: ' ', + del: '\u007f', +} + +sc_Char.prototype.toString = function () { + return this.val +} +// sc_toDisplayString == toString +sc_Char.prototype.sc_toWriteString = function () { + var entry = sc_Char.char2readable[this.val] + if (entry) return entry + else return '#\\' + this.val +} + +/*** META ((export #t) + (type bool) + (peephole (postfix "instanceof sc_Char"))) +*/ +function sc_isChar(c) { + return c instanceof sc_Char +} + +/*** META ((export char=?) + (type bool) + (peephole (hole 2 c1 ".val === " c2 ".val"))) +*/ +var sc_isCharEqual = sc_isCharStringEqual +/*** META ((export char?) + (type bool) + (peephole (hole 2 c1 ".val > " c2 ".val"))) +*/ +var sc_isCharGreater = sc_isCharStringGreater +/*** META ((export char<=?) + (type bool) + (peephole (hole 2 c1 ".val <= " c2 ".val"))) +*/ +var sc_isCharLessEqual = sc_isCharStringLessEqual +/*** META ((export char>=?) + (type bool) + (peephole (hole 2 c1 ".val >= " c2 ".val"))) +*/ +var sc_isCharGreaterEqual = sc_isCharStringGreaterEqual +/*** META ((export char-ci=?) + (type bool) + (peephole (hole 2 c1 ".val.toLowerCase() === " c2 ".val.toLowerCase()"))) +*/ +var sc_isCharCIEqual = sc_isCharStringCIEqual +/*** META ((export char-ci?) + (type bool) + (peephole (hole 2 c1 ".val.toLowerCase() > " c2 ".val.toLowerCase()"))) +*/ +var sc_isCharCIGreater = sc_isCharStringCIGreater +/*** META ((export char-ci<=?) + (type bool) + (peephole (hole 2 c1 ".val.toLowerCase() <= " c2 ".val.toLowerCase()"))) +*/ +var sc_isCharCILessEqual = sc_isCharStringCILessEqual +/*** META ((export char-ci>=?) + (type bool) + (peephole (hole 2 c1 ".val.toLowerCase() >= " c2 ".val.toLowerCase()"))) +*/ +var sc_isCharCIGreaterEqual = sc_isCharStringCIGreaterEqual + +var SC_NUMBER_CLASS = '0123456789' +var SC_WHITESPACE_CLASS = ' \r\n\t\f' +var SC_LOWER_CLASS = 'abcdefghijklmnopqrstuvwxyz' +var SC_UPPER_CLASS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + +function sc_isCharOfClass(c, cl) { + return cl.indexOf(c) != -1 +} +/*** META ((export #t) + (type bool)) +*/ +function sc_isCharAlphabetic(c) { + return ( + sc_isCharOfClass(c.val, SC_LOWER_CLASS) || + sc_isCharOfClass(c.val, SC_UPPER_CLASS) + ) +} +/*** META ((export #t) + (type bool) + (peephole (hole 1 "SC_NUMBER_CLASS.indexOf(" c ".val) != -1"))) +*/ +function sc_isCharNumeric(c) { + return sc_isCharOfClass(c.val, SC_NUMBER_CLASS) +} +/*** META ((export #t) + (type bool)) +*/ +function sc_isCharWhitespace(c) { + var tmp = c.val + return ( + tmp === ' ' || tmp === '\r' || tmp === '\n' || tmp === '\t' || tmp === '\f' + ) +} +/*** META ((export #t) + (type bool) + (peephole (hole 1 "SC_UPPER_CLASS.indexOf(" c ".val) != -1"))) +*/ +function sc_isCharUpperCase(c) { + return sc_isCharOfClass(c.val, SC_UPPER_CLASS) +} +/*** META ((export #t) + (type bool) + (peephole (hole 1 "SC_LOWER_CLASS.indexOf(" c ".val) != -1"))) +*/ +function sc_isCharLowerCase(c) { + return sc_isCharOfClass(c.val, SC_LOWER_CLASS) +} + +/*** META ((export #t) + (peephole (postfix ".val.charCodeAt(0)"))) +*/ +function sc_char2integer(c) { + return c.val.charCodeAt(0) +} +/*** META ((export #t) + (peephole (hole 1 "new sc_Char(String.fromCharCode(" n "))"))) +*/ +function sc_integer2char(n) { + return new sc_Char(String.fromCharCode(n)) +} + +/*** META ((export #t) + (peephole (hole 1 "new sc_Char(" c ".val.toUpperCase())"))) +*/ +function sc_charUpcase(c) { + return new sc_Char(c.val.toUpperCase()) +} +/*** META ((export #t) + (peephole (hole 1 "new sc_Char(" c ".val.toLowerCase())"))) +*/ +function sc_charDowncase(c) { + return new sc_Char(c.val.toLowerCase()) +} + +function sc_makeJSStringOfLength(k, c) { + var fill + if (c === undefined) fill = ' ' + else fill = c + var res = '' + var len = 1 + // every round doubles the size of fill. + while (k >= len) { + if (k & len) res = res.concat(fill) + fill = fill.concat(fill) + len *= 2 + } + return res +} + +function sc_makejsString(k, c) { + var fill + if (c) fill = c.val + else fill = ' ' + return sc_makeJSStringOfLength(k, fill) +} + +function sc_jsstring2list(s) { + var res = null + for (var i = s.length - 1; i >= 0; i--) + res = sc_cons(new sc_Char(s.charAt(i)), res) + return res +} + +function sc_list2jsstring(l) { + var a = new Array() + while (l !== null) { + a.push(l.car.val) + l = l.cdr + } + return ''.concat.apply('', a) +} + +var sc_Vector = Array + +sc_Vector.prototype.sc_toWriteOrDisplayString = function (writeOrDisplay) { + if (this.length === 0) return '#()' + + var res = '#(' + writeOrDisplay(this[0]) + for (var i = 1; i < this.length; i++) res += ' ' + writeOrDisplay(this[i]) + res += ')' + return res +} +sc_Vector.prototype.sc_toDisplayString = function () { + return this.sc_toWriteOrDisplayString(sc_toDisplayString) +} +sc_Vector.prototype.sc_toWriteString = function () { + return this.sc_toWriteOrDisplayString(sc_toWriteString) +} + +/*** META ((export vector? array?) + (type bool) + (peephole (postfix " instanceof sc_Vector"))) +*/ +function sc_isVector(v) { + return v instanceof sc_Vector +} + +// only applies to vectors +function sc_isVectorEqual(v1, v2, comp) { + if (v1.length !== v2.length) return false + for (var i = 0; i < v1.length; i++) if (!comp(v1[i], v2[i])) return false + return true +} + +/*** META ((export make-vector make-array)) */ +function sc_makeVector(size, fill) { + var a = new sc_Vector(size) + if (fill !== undefined) sc_vectorFillBang(a, fill) + return a +} + +/*** META ((export vector array) + (peephole (vector))) +*/ +function sc_vector() { + var a = new sc_Vector() + for (var i = 0; i < arguments.length; i++) a.push(arguments[i]) + return a +} + +/*** META ((export vector-length array-length) + (peephole (postfix ".length"))) +*/ +function sc_vectorLength(v) { + return v.length +} + +/*** META ((export vector-ref array-ref) + (peephole (hole 2 v "[" pos "]"))) +*/ +function sc_vectorRef(v, pos) { + return v[pos] +} + +/*** META ((export vector-set! array-set!) + (peephole (hole 3 v "[" pos "] = " val))) +*/ +function sc_vectorSetBang(v, pos, val) { + v[pos] = val +} + +/*** META ((export vector->list array->list)) */ +function sc_vector2list(a) { + var res = null + for (var i = a.length - 1; i >= 0; i--) res = sc_cons(a[i], res) + return res +} + +/*** META ((export list->vector list->array)) */ +function sc_list2vector(l) { + var a = new sc_Vector() + while (l !== null) { + a.push(l.car) + l = l.cdr + } + return a +} + +/*** META ((export vector-fill! array-fill!)) */ +function sc_vectorFillBang(a, fill) { + for (var i = 0; i < a.length; i++) a[i] = fill +} + +/*** META ((export #t)) */ +function sc_copyVector(a, len) { + if (len <= a.length) return a.slice(0, len) + else { + var tmp = a.concat() + tmp.length = len + return tmp + } +} + +/*** META ((export #t) + (peephole (hole 3 a ".slice(" start "," end ")"))) +*/ +function sc_vectorCopy(a, start, end) { + return a.slice(start, end) +} + +/*** META ((export #t)) */ +function sc_vectorCopyBang(target, tstart, source, sstart, send) { + if (!sstart) sstart = 0 + if (!send) send = source.length + + // if target == source we don't want to overwrite not yet copied elements. + if (tstart <= sstart) { + for (var i = tstart, j = sstart; j < send; i++, j++) { + target[i] = source[j] + } + } else { + var diff = send - sstart + for (var i = tstart + diff - 1, j = send - 1; j >= sstart; i--, j--) { + target[i] = source[j] + } + } + return target +} + +/*** META ((export #t) + (type bool) + (peephole (hole 1 "typeof " o " === 'function'"))) +*/ +function sc_isProcedure(o) { + return typeof o === 'function' +} + +/*** META ((export #t)) */ +function sc_apply(proc) { + var args = new Array() + // first part of arguments are not in list-form. + for (var i = 1; i < arguments.length - 1; i++) args.push(arguments[i]) + var l = arguments[arguments.length - 1] + while (l !== null) { + args.push(l.car) + l = l.cdr + } + return proc.apply(null, args) +} + +/*** META ((export #t)) */ +function sc_map(proc, l1) { + if (l1 === undefined) return null + // else + var nbApplyArgs = arguments.length - 1 + var applyArgs = new Array(nbApplyArgs) + var revres = null + while (l1 !== null) { + for (var i = 0; i < nbApplyArgs; i++) { + applyArgs[i] = arguments[i + 1].car + arguments[i + 1] = arguments[i + 1].cdr + } + revres = sc_cons(proc.apply(null, applyArgs), revres) + } + return sc_reverseAppendBang(revres, null) +} + +/*** META ((export #t)) */ +function sc_mapBang(proc, l1) { + if (l1 === undefined) return null + // else + var l1_orig = l1 + var nbApplyArgs = arguments.length - 1 + var applyArgs = new Array(nbApplyArgs) + while (l1 !== null) { + var tmp = l1 + for (var i = 0; i < nbApplyArgs; i++) { + applyArgs[i] = arguments[i + 1].car + arguments[i + 1] = arguments[i + 1].cdr + } + tmp.car = proc.apply(null, applyArgs) + } + return l1_orig +} + +/*** META ((export #t)) */ +function sc_forEach(proc, l1) { + if (l1 === undefined) return undefined + // else + var nbApplyArgs = arguments.length - 1 + var applyArgs = new Array(nbApplyArgs) + while (l1 !== null) { + for (var i = 0; i < nbApplyArgs; i++) { + applyArgs[i] = arguments[i + 1].car + arguments[i + 1] = arguments[i + 1].cdr + } + proc.apply(null, applyArgs) + } + // add return so FF does not complain. + return undefined +} + +/*** META ((export #t)) */ +function sc_filter(proc, l1) { + var dummy = { cdr: null } + var tail = dummy + while (l1 !== null) { + if (proc(l1.car) !== false) { + tail.cdr = sc_cons(l1.car, null) + tail = tail.cdr + } + l1 = l1.cdr + } + return dummy.cdr +} + +/*** META ((export #t)) */ +function sc_filterBang(proc, l1) { + var head = sc_cons('dummy', l1) + var it = head + var next = l1 + while (next !== null) { + if (proc(next.car) !== false) { + it.cdr = next + it = next + } + next = next.cdr + } + it.cdr = null + return head.cdr +} + +function sc_filterMap1(proc, l1) { + var revres = null + while (l1 !== null) { + var tmp = proc(l1.car) + if (tmp !== false) revres = sc_cons(tmp, revres) + l1 = l1.cdr + } + return sc_reverseAppendBang(revres, null) +} +function sc_filterMap2(proc, l1, l2) { + var revres = null + while (l1 !== null) { + var tmp = proc(l1.car, l2.car) + if (tmp !== false) revres = sc_cons(tmp, revres) + l1 = l1.cdr + l2 = l2.cdr + } + return sc_reverseAppendBang(revres, null) +} + +/*** META ((export #t)) */ +function sc_filterMap(proc, l1, l2, l3) { + if (l2 === undefined) return sc_filterMap1(proc, l1) + else if (l3 === undefined) return sc_filterMap2(proc, l1, l2) + // else + var nbApplyArgs = arguments.length - 1 + var applyArgs = new Array(nbApplyArgs) + var revres = null + while (l1 !== null) { + for (var i = 0; i < nbApplyArgs; i++) { + applyArgs[i] = arguments[i + 1].car + arguments[i + 1] = arguments[i + 1].cdr + } + var tmp = proc.apply(null, applyArgs) + if (tmp !== false) revres = sc_cons(tmp, revres) + } + return sc_reverseAppendBang(revres, null) +} + +/*** META ((export #t)) */ +function sc_any(proc, l) { + var revres = null + while (l !== null) { + var tmp = proc(l.car) + if (tmp !== false) return tmp + l = l.cdr + } + return false +} + +/*** META ((export any?) + (peephole (hole 2 "sc_any(" proc "," l ") !== false"))) +*/ +function sc_anyPred(proc, l) { + return sc_any(proc, l) !== false +} + +/*** META ((export #t)) */ +function sc_every(proc, l) { + var revres = null + var tmp = true + while (l !== null) { + tmp = proc(l.car) + if (tmp === false) return false + l = l.cdr + } + return tmp +} + +/*** META ((export every?) + (peephole (hole 2 "sc_every(" proc "," l ") !== false"))) +*/ +function sc_everyPred(proc, l) { + var tmp = sc_every(proc, l) + if (tmp !== false) return true + return false +} + +/*** META ((export #t) + (peephole (postfix "()"))) +*/ +function sc_force(o) { + return o() +} + +/*** META ((export #t)) */ +function sc_makePromise(proc) { + var isResultReady = false + var result = undefined + return function () { + if (!isResultReady) { + var tmp = proc() + if (!isResultReady) { + isResultReady = true + result = tmp + } + } + return result + } +} + +function sc_Values(values) { + this.values = values +} + +/*** META ((export #t) + (peephole (values))) +*/ +function sc_values() { + if (arguments.length === 1) return arguments[0] + else return new sc_Values(arguments) +} + +/*** META ((export #t)) */ +function sc_callWithValues(producer, consumer) { + var produced = producer() + if (produced instanceof sc_Values) + return consumer.apply(null, produced.values) + else return consumer(produced) +} + +/*** META ((export #t)) */ +function sc_dynamicWind(before, thunk, after) { + before() + try { + var res = thunk() + return res + } finally { + after() + } +} + +// TODO: eval/scheme-report-environment/null-environment/interaction-environment + +// LIMITATION: 'load' doesn't exist without files. +// LIMITATION: transcript-on/transcript-off doesn't exist without files. + +function sc_Struct(name) { + this.name = name +} +sc_Struct.prototype.sc_toDisplayString = function () { + return '#' +} +sc_Struct.prototype.sc_toWriteString = sc_Struct.prototype.sc_toDisplayString + +/*** META ((export #t) + (peephole (hole 1 "new sc_Struct(" name ")"))) +*/ +function sc_makeStruct(name) { + return new sc_Struct(name) +} + +/*** META ((export #t) + (type bool) + (peephole (postfix " instanceof sc_Struct"))) +*/ +function sc_isStruct(o) { + return o instanceof sc_Struct +} + +/*** META ((export #t) + (type bool) + (peephole (hole 2 "(" 1 " instanceof sc_Struct) && ( " 1 ".name === " 0 ")"))) +*/ +function sc_isStructNamed(name, s) { + return s instanceof sc_Struct && s.name === name +} + +/*** META ((export struct-field) + (peephole (hole 3 0 "[" 2 "]"))) +*/ +function sc_getStructField(s, name, field) { + return s[field] +} + +/*** META ((export struct-field-set!) + (peephole (hole 4 0 "[" 2 "] = " 3))) +*/ +function sc_setStructFieldBang(s, name, field, val) { + s[field] = val +} + +/*** META ((export #t) + (peephole (prefix "~"))) +*/ +function sc_bitNot(x) { + return ~x +} + +/*** META ((export #t) + (peephole (infix 2 2 "&"))) +*/ +function sc_bitAnd(x, y) { + return x & y +} + +/*** META ((export #t) + (peephole (infix 2 2 "|"))) +*/ +function sc_bitOr(x, y) { + return x | y +} + +/*** META ((export #t) + (peephole (infix 2 2 "^"))) +*/ +function sc_bitXor(x, y) { + return x ^ y +} + +/*** META ((export #t) + (peephole (infix 2 2 "<<"))) +*/ +function sc_bitLsh(x, y) { + return x << y +} + +/*** META ((export #t) + (peephole (infix 2 2 ">>"))) +*/ +function sc_bitRsh(x, y) { + return x >> y +} + +/*** META ((export #t) + (peephole (infix 2 2 ">>>"))) +*/ +function sc_bitUrsh(x, y) { + return x >>> y +} + +/*** META ((export js-field js-property) + (peephole (hole 2 o "[" field "]"))) +*/ +function sc_jsField(o, field) { + return o[field] +} + +/*** META ((export js-field-set! js-property-set!) + (peephole (hole 3 o "[" field "] = " val))) +*/ +function sc_setJsFieldBang(o, field, val) { + return (o[field] = val) +} + +/*** META ((export js-field-delete! js-property-delete!) + (peephole (hole 2 "delete" o "[" field "]"))) +*/ +function sc_deleteJsFieldBang(o, field) { + delete o[field] +} + +/*** META ((export #t) + (peephole (jsCall))) +*/ +function sc_jsCall(o, fun) { + var args = new Array() + for (var i = 2; i < arguments.length; i++) args[i - 2] = arguments[i] + return fun.apply(o, args) +} + +/*** META ((export #t) + (peephole (jsMethodCall))) +*/ +function sc_jsMethodCall(o, field) { + var args = new Array() + for (var i = 2; i < arguments.length; i++) args[i - 2] = arguments[i] + return o[field].apply(o, args) +} + +/*** META ((export new js-new) + (peephole (jsNew))) +*/ +function sc_jsNew(c) { + var evalStr = 'new c(' + evalStr += arguments.length > 1 ? 'arguments[1]' : '' + for (var i = 2; i < arguments.length; i++) evalStr += ', arguments[' + i + ']' + evalStr += ')' + return eval(evalStr) +} + +// ======================== RegExp ==================== +/*** META ((export #t)) */ +function sc_pregexp(re) { + return new RegExp(sc_string2jsstring(re)) +} + +/*** META ((export #t)) */ +function sc_pregexpMatch(re, s) { + var reg = re instanceof RegExp ? re : sc_pregexp(re) + var tmp = reg.exec(sc_string2jsstring(s)) + + if (tmp == null) return false + + var res = null + for (var i = tmp.length - 1; i >= 0; i--) { + if (tmp[i] !== null) { + res = sc_cons(sc_jsstring2string(tmp[i]), res) + } else { + res = sc_cons(false, res) + } + } + return res +} + +/*** META ((export #t)) */ +function sc_pregexpReplace(re, s1, s2) { + var reg + var jss1 = sc_string2jsstring(s1) + var jss2 = sc_string2jsstring(s2) + + if (re instanceof RegExp) { + if (re.global) reg = re + else reg = new RegExp(re.source) + } else { + reg = new RegExp(sc_string2jsstring(re)) + } + + return jss1.replace(reg, jss2) +} + +/*** META ((export pregexp-replace*)) */ +function sc_pregexpReplaceAll(re, s1, s2) { + var reg + var jss1 = sc_string2jsstring(s1) + var jss2 = sc_string2jsstring(s2) + + if (re instanceof RegExp) { + if (re.global) reg = re + else reg = new RegExp(re.source, 'g') + } else { + reg = new RegExp(sc_string2jsstring(re), 'g') + } + + return jss1.replace(reg, jss2) +} + +/*** META ((export #t)) */ +function sc_pregexpSplit(re, s) { + var reg = re instanceof RegExp ? re : new RegExp(sc_string2jsstring(re)) + var jss = sc_string2jsstring(s) + var tmp = jss.split(reg) + + if (tmp == null) return false + + return sc_vector2list(tmp) +} + +/* =========================================================================== */ +/* Other library stuff */ +/* =========================================================================== */ + +/*** META ((export #t) + (peephole (hole 1 "Math.floor(Math.random()*" 'n ")"))) +*/ +function sc_random(n) { + return Math.floor(Math.random() * n) +} + +/*** META ((export current-date) + (peephole (hole 0 "new Date()"))) +*/ +function sc_currentDate() { + return new Date() +} + +function sc_Hashtable() {} +sc_Hashtable.prototype.toString = function () { + return '#{%hashtable}' +} +// sc_toWriteString == sc_toDisplayString == toString + +function sc_HashtableElement(key, val) { + this.key = key + this.val = val +} + +/*** META ((export #t) + (peephole (hole 0 "new sc_Hashtable()"))) +*/ +function sc_makeHashtable() { + return new sc_Hashtable() +} + +/*** META ((export #t)) */ +function sc_hashtablePutBang(ht, key, val) { + var hash = sc_hash(key) + ht[hash] = new sc_HashtableElement(key, val) +} + +/*** META ((export #t)) */ +function sc_hashtableGet(ht, key) { + var hash = sc_hash(key) + if (hash in ht) return ht[hash].val + else return false +} + +/*** META ((export #t)) */ +function sc_hashtableForEach(ht, f) { + for (var v in ht) { + if (ht[v] instanceof sc_HashtableElement) f(ht[v].key, ht[v].val) + } +} + +/*** META ((export hashtable-contains?) + (peephole (hole 2 "sc_hash(" 1 ") in " 0))) +*/ +function sc_hashtableContains(ht, key) { + var hash = sc_hash(key) + if (hash in ht) return true + else return false +} + +var SC_HASH_COUNTER = 0 + +function sc_hash(o) { + if (o === null) return 'null' + else if (o === undefined) return 'undefined' + else if (o === true) return 'true' + else if (o === false) return 'false' + else if (typeof o === 'number') return 'num-' + o + else if (typeof o === 'string') return 'jsstr-' + o + else if (o.sc_getHash) return o.sc_getHash() + else return sc_counterHash.call(o) +} +function sc_counterHash() { + if (!this.sc_hash) { + this.sc_hash = 'hash-' + SC_HASH_COUNTER + SC_HASH_COUNTER++ + } + return this.sc_hash +} + +function sc_Trampoline(args, maxTailCalls) { + this['__trampoline return__'] = true + this.args = args + this.MAX_TAIL_CALLs = maxTailCalls +} +// TODO: call/cc stuff +sc_Trampoline.prototype.restart = function () { + var o = this + while (true) { + // set both globals. + SC_TAIL_OBJECT.calls = o.MAX_TAIL_CALLs - 1 + var fun = o.args.callee + var res = fun.apply(SC_TAIL_OBJECT, o.args) + if (res instanceof sc_Trampoline) o = res + else return res + } +} + +/*** META ((export bind-exit-lambda)) */ +function sc_bindExitLambda(proc) { + var escape_obj = new sc_BindExitException() + var escape = function (res) { + escape_obj.res = res + throw escape_obj + } + try { + return proc(escape) + } catch (e) { + if (e === escape_obj) { + return e.res + } + throw e + } +} +function sc_BindExitException() { + this._internalException = true +} + +var SC_SCM2JS_GLOBALS = new Object() + +// default tail-call depth. +// normally the program should set it again. but just in case... +var SC_TAIL_OBJECT = new Object() +SC_SCM2JS_GLOBALS.TAIL_OBJECT = SC_TAIL_OBJECT +// ======================== I/O ======================= + +/*------------------------------------------------------------------*/ + +function sc_EOF() {} +var SC_EOF_OBJECT = new sc_EOF() + +function sc_Port() {} + +/* --------------- Input ports -------------------------------------*/ + +function sc_InputPort() {} +sc_InputPort.prototype = new sc_Port() + +sc_InputPort.prototype.peekChar = function () { + if (!('peeked' in this)) this.peeked = this.getNextChar() + return this.peeked +} +sc_InputPort.prototype.readChar = function () { + var tmp = this.peekChar() + delete this.peeked + return tmp +} +sc_InputPort.prototype.isCharReady = function () { + return true +} +sc_InputPort.prototype.close = function () { + // do nothing +} + +/* .............. String port ..........................*/ +function sc_ErrorInputPort() {} +sc_ErrorInputPort.prototype = new sc_InputPort() +sc_ErrorInputPort.prototype.getNextChar = function () { + throw "can't read from error-port." +} +sc_ErrorInputPort.prototype.isCharReady = function () { + return false +} + +/* .............. String port ..........................*/ + +function sc_StringInputPort(jsStr) { + // we are going to do some charAts on the str. + // instead of recreating all the time a String-object, we + // create one in the beginning. (not sure, if this is really an optim) + this.str = new String(jsStr) + this.pos = 0 +} +sc_StringInputPort.prototype = new sc_InputPort() +sc_StringInputPort.prototype.getNextChar = function () { + if (this.pos >= this.str.length) return SC_EOF_OBJECT + return this.str.charAt(this.pos++) +} + +/* ------------- Read and other lib-funs -------------------------------*/ +function sc_Token(type, val, pos) { + this.type = type + this.val = val + this.pos = pos +} +sc_Token.EOF = 0 /*EOF*/ +sc_Token.OPEN_PAR = 1 /*OPEN_PAR*/ +sc_Token.CLOSE_PAR = 2 /*CLOSE_PAR*/ +sc_Token.OPEN_BRACE = 3 /*OPEN_BRACE*/ +sc_Token.CLOSE_BRACE = 4 /*CLOSE_BRACE*/ +sc_Token.OPEN_BRACKET = 5 /*OPEN_BRACKET*/ +sc_Token.CLOSE_BRACKET = 6 /*CLOSE_BRACKET*/ +sc_Token.WHITESPACE = 7 /*WHITESPACE*/ +sc_Token.QUOTE = 8 /*QUOTE*/ +sc_Token.ID = 9 /*ID*/ +sc_Token.DOT = 10 /*DOT*/ +sc_Token.STRING = 11 /*STRING*/ +sc_Token.NUMBER = 12 /*NUMBER*/ +sc_Token.ERROR = 13 /*ERROR*/ +sc_Token.VECTOR_BEGIN = 14 /*VECTOR_BEGIN*/ +sc_Token.TRUE = 15 /*TRUE*/ +sc_Token.FALSE = 16 /*FALSE*/ +sc_Token.UNSPECIFIED = 17 /*UNSPECIFIED*/ +sc_Token.REFERENCE = 18 /*REFERENCE*/ +sc_Token.STORE = 19 /*STORE*/ +sc_Token.CHAR = 20 /*CHAR*/ + +var SC_ID_CLASS = SC_LOWER_CLASS + SC_UPPER_CLASS + '!$%*+-./:<=>?@^_~' +function sc_Tokenizer(port) { + this.port = port +} +sc_Tokenizer.prototype.peekToken = function () { + if (this.peeked) return this.peeked + var newToken = this.nextToken() + this.peeked = newToken + return newToken +} +sc_Tokenizer.prototype.readToken = function () { + var tmp = this.peekToken() + delete this.peeked + return tmp +} +sc_Tokenizer.prototype.nextToken = function () { + var port = this.port + + function isNumberChar(c) { + return c >= '0' && c <= '9' + } + function isIdOrNumberChar(c) { + return ( + SC_ID_CLASS.indexOf(c) != -1 || // ID-char + (c >= '0' && c <= '9') + ) + } + function isWhitespace(c) { + return c === ' ' || c === '\r' || c === '\n' || c === '\t' || c === '\f' + } + function isWhitespaceOrEOF(c) { + return isWhitespace(c) || c === SC_EOF_OBJECT + } + + function readString() { + res = '' + while (true) { + var c = port.readChar() + switch (c) { + case '"': + return new sc_Token(11 /*STRING*/, res) + case '\\': + var tmp = port.readChar() + switch (tmp) { + case '0': + res += '\0' + break + case 'a': + res += 'a' + break + case 'b': + res += '\b' + break + case 'f': + res += '\f' + break + case 'n': + res += '\n' + break + case 'r': + res += '\r' + break + case 't': + res += '\t' + break + case 'v': + res += '\v' + break + case '"': + res += '"' + break + case '\\': + res += '\\' + break + case 'x': + /* hexa-number */ + var nb = 0 + while (true) { + var hexC = port.peekChar() + if (hexC >= '0' && hexC <= '9') { + port.readChar() + nb = nb * 16 + hexC.charCodeAt(0) - '0'.charCodeAt(0) + } else if (hexC >= 'a' && hexC <= 'f') { + port.readChar() + nb = nb * 16 + hexC.charCodeAt(0) - 'a'.charCodeAt(0) + } else if (hexC >= 'A' && hexC <= 'F') { + port.readChar() + nb = nb * 16 + hexC.charCodeAt(0) - 'A'.charCodeAt(0) + } else { + // next char isn't part of hex. + res += String.fromCharCode(nb) + break + } + } + break + default: + if (tmp === SC_EOF_OBJECT) { + return new sc_Token( + 13 /*ERROR*/, + 'unclosed string-literal' + res + ) + } + res += tmp + } + break + default: + if (c === SC_EOF_OBJECT) { + return new sc_Token(13 /*ERROR*/, 'unclosed string-literal' + res) + } + res += c + } + } + } + function readIdOrNumber(firstChar) { + var res = firstChar + while (isIdOrNumberChar(port.peekChar())) res += port.readChar() + if (isNaN(res)) return new sc_Token(9 /*ID*/, res) + else return new sc_Token(12 /*NUMBER*/, res - 0) + } + + function skipWhitespaceAndComments() { + var done = false + while (!done) { + done = true + while (isWhitespace(port.peekChar())) port.readChar() + if (port.peekChar() === ';') { + port.readChar() + done = false + while (true) { + curChar = port.readChar() + if (curChar === SC_EOF_OBJECT || curChar === '\n') break + } + } + } + } + + function readDot() { + if (isWhitespace(port.peekChar())) return new sc_Token(10 /*DOT*/) + else return readIdOrNumber('.') + } + + function readSharp() { + var c = port.readChar() + if (isWhitespace(c)) return new sc_Token(13 /*ERROR*/, 'bad #-pattern0.') + + // reference + if (isNumberChar(c)) { + var nb = c - 0 + while (isNumberChar(port.peekChar())) nb = nb * 10 + (port.readChar() - 0) + switch (port.readChar()) { + case '#': + return new sc_Token(18 /*REFERENCE*/, nb) + case '=': + return new sc_Token(19 /*STORE*/, nb) + default: + return new sc_Token(13 /*ERROR*/, 'bad #-pattern1.' + nb) + } + } + + if (c === '(') return new sc_Token(14 /*VECTOR_BEGIN*/) + + if (c === '\\') { + // character + var tmp = '' + while (!isWhitespaceOrEOF(port.peekChar())) tmp += port.readChar() + switch (tmp.length) { + case 0: // it's escaping a whitespace char: + if (sc_isEOFObject(port.peekChar)) + return new sc_Token(13 /*ERROR*/, 'bad #-pattern2.') + else return new sc_Token(20 /*CHAR*/, port.readChar()) + case 1: + return new sc_Token(20 /*CHAR*/, tmp) + default: + var entry = sc_Char.readable2char[tmp.toLowerCase()] + if (entry) return new sc_Token(20 /*CHAR*/, entry) + else + return new sc_Token( + 13 /*ERROR*/, + 'unknown character description: #\\' + tmp + ) + } + } + + // some constants (#t, #f, #unspecified) + var res + var needing + switch (c) { + case 't': + res = new sc_Token(15 /*TRUE*/, true) + needing = '' + break + case 'f': + res = new sc_Token(16 /*FALSE*/, false) + needing = '' + break + case 'u': + res = new sc_Token(17 /*UNSPECIFIED*/, undefined) + needing = 'nspecified' + break + default: + return new sc_Token(13 /*ERROR*/, 'bad #-pattern3: ' + c) + } + while (true) { + c = port.peekChar() + if ((isWhitespaceOrEOF(c) || c === ')') && needing == '') return res + else if (isWhitespace(c) || needing == '') + return new sc_Token(13 /*ERROR*/, 'bad #-pattern4 ' + c + ' ' + needing) + else if (needing.charAt(0) == c) { + port.readChar() // consume + needing = needing.slice(1) + } else return new sc_Token(13 /*ERROR*/, 'bad #-pattern5') + } + } + + skipWhitespaceAndComments() + var curChar = port.readChar() + if (curChar === SC_EOF_OBJECT) return new sc_Token(0 /*EOF*/, curChar) + switch (curChar) { + case ' ': + case '\n': + case '\t': + return readWhitespace() + case '(': + return new sc_Token(1 /*OPEN_PAR*/) + case ')': + return new sc_Token(2 /*CLOSE_PAR*/) + case '{': + return new sc_Token(3 /*OPEN_BRACE*/) + case '}': + return new sc_Token(4 /*CLOSE_BRACE*/) + case '[': + return new sc_Token(5 /*OPEN_BRACKET*/) + case ']': + return new sc_Token(6 /*CLOSE_BRACKET*/) + case "'": + return new sc_Token(8 /*QUOTE*/) + case '#': + return readSharp() + case '.': + return readDot() + case '"': + return readString() + default: + if (isIdOrNumberChar(curChar)) return readIdOrNumber(curChar) + throw 'unexpected character: ' + curChar + } +} + +function sc_Reader(tokenizer) { + this.tokenizer = tokenizer + this.backref = new Array() +} +sc_Reader.prototype.read = function () { + function readList(listBeginType) { + function matchesPeer(open, close) { + return ( + (open === 1 /*OPEN_PAR*/ && close === 2) /*CLOSE_PAR*/ || + (open === 3 /*OPEN_BRACE*/ && close === 4) /*CLOSE_BRACE*/ || + (open === 5 /*OPEN_BRACKET*/ && close === 6) /*CLOSE_BRACKET*/ + ) + } + var res = null + + while (true) { + var token = tokenizer.peekToken() + + switch (token.type) { + case 2 /*CLOSE_PAR*/: + case 4 /*CLOSE_BRACE*/: + case 6 /*CLOSE_BRACKET*/: + if (matchesPeer(listBeginType, token.type)) { + tokenizer.readToken() // consume token + return sc_reverseBang(res) + } else + throw ( + "closing par doesn't match: " + listBeginType + ' ' + listEndType + ) + + case 0 /*EOF*/: + throw 'unexpected end of file' + + case 10 /*DOT*/: + tokenizer.readToken() // consume token + var cdr = this.read() + var par = tokenizer.readToken() + if (!matchesPeer(listBeginType, par.type)) + throw "closing par doesn't match: " + listBeginType + ' ' + par.type + else return sc_reverseAppendBang(res, cdr) + + default: + res = sc_cons(this.read(), res) + } + } + } + function readQuote() { + return sc_cons('quote', sc_cons(this.read(), null)) + } + function readVector() { + // opening-parenthesis is already consumed + var a = new Array() + while (true) { + var token = tokenizer.peekToken() + switch (token.type) { + case 2 /*CLOSE_PAR*/: + tokenizer.readToken() + return a + + default: + a.push(this.read()) + } + } + } + + function storeRefence(nb) { + var tmp = this.read() + this.backref[nb] = tmp + return tmp + } + + function readReference(nb) { + if (nb in this.backref) return this.backref[nb] + else throw 'bad reference: ' + nb + } + + var tokenizer = this.tokenizer + + var token = tokenizer.readToken() + + // handle error + if (token.type === 13 /*ERROR*/) throw token.val + + switch (token.type) { + case 1 /*OPEN_PAR*/: + case 3 /*OPEN_BRACE*/: + case 5 /*OPEN_BRACKET*/: + return readList.call(this, token.type) + case 8 /*QUOTE*/: + return readQuote.call(this) + case 11 /*STRING*/: + return sc_jsstring2string(token.val) + case 20 /*CHAR*/: + return new sc_Char(token.val) + case 14 /*VECTOR_BEGIN*/: + return readVector.call(this) + case 18 /*REFERENCE*/: + return readReference.call(this, token.val) + case 19 /*STORE*/: + return storeRefence.call(this, token.val) + case 9 /*ID*/: + return sc_jsstring2symbol(token.val) + case 0 /*EOF*/: + case 12 /*NUMBER*/: + case 15 /*TRUE*/: + case 16 /*FALSE*/: + case 17 /*UNSPECIFIED*/: + return token.val + default: + throw 'unexpected token ' + token.type + ' ' + token.val + } +} + +/*** META ((export #t)) */ +function sc_read(port) { + if (port === undefined) + // we assume the port hasn't been given. + port = SC_DEFAULT_IN // THREAD: shared var... + var reader = new sc_Reader(new sc_Tokenizer(port)) + return reader.read() +} +/*** META ((export #t)) */ +function sc_readChar(port) { + if (port === undefined) + // we assume the port hasn't been given. + port = SC_DEFAULT_IN // THREAD: shared var... + var t = port.readChar() + return t === SC_EOF_OBJECT ? t : new sc_Char(t) +} +/*** META ((export #t)) */ +function sc_peekChar(port) { + if (port === undefined) + // we assume the port hasn't been given. + port = SC_DEFAULT_IN // THREAD: shared var... + var t = port.peekChar() + return t === SC_EOF_OBJECT ? t : new sc_Char(t) +} +/*** META ((export #t) + (type bool)) +*/ +function sc_isCharReady(port) { + if (port === undefined) + // we assume the port hasn't been given. + port = SC_DEFAULT_IN // THREAD: shared var... + return port.isCharReady() +} +/*** META ((export #t) + (peephole (postfix ".close()"))) +*/ +function sc_closeInputPort(p) { + return p.close() +} + +/*** META ((export #t) + (type bool) + (peephole (postfix " instanceof sc_InputPort"))) +*/ +function sc_isInputPort(o) { + return o instanceof sc_InputPort +} + +/*** META ((export eof-object?) + (type bool) + (peephole (postfix " === SC_EOF_OBJECT"))) +*/ +function sc_isEOFObject(o) { + return o === SC_EOF_OBJECT +} + +/*** META ((export #t) + (peephole (hole 0 "SC_DEFAULT_IN"))) +*/ +function sc_currentInputPort() { + return SC_DEFAULT_IN +} + +/* ------------ file operations are not supported -----------*/ +/*** META ((export #t)) */ +function sc_callWithInputFile(s, proc) { + throw "can't open " + s +} + +/*** META ((export #t)) */ +function sc_callWithOutputFile(s, proc) { + throw "can't open " + s +} + +/*** META ((export #t)) */ +function sc_withInputFromFile(s, thunk) { + throw "can't open " + s +} + +/*** META ((export #t)) */ +function sc_withOutputToFile(s, thunk) { + throw "can't open " + s +} + +/*** META ((export #t)) */ +function sc_openInputFile(s) { + throw "can't open " + s +} + +/*** META ((export #t)) */ +function sc_openOutputFile(s) { + throw "can't open " + s +} + +/* ----------------------------------------------------------------------------*/ +/*** META ((export #t)) */ +function sc_basename(p) { + var i = p.lastIndexOf('/') + + if (i >= 0) return p.substring(i + 1, p.length) + else return '' +} + +/*** META ((export #t)) */ +function sc_dirname(p) { + var i = p.lastIndexOf('/') + + if (i >= 0) return p.substring(0, i) + else return '' +} + +/* ----------------------------------------------------------------------------*/ + +/*** META ((export #t)) */ +function sc_withInputFromPort(p, thunk) { + try { + var tmp = SC_DEFAULT_IN // THREAD: shared var. + SC_DEFAULT_IN = p + return thunk() + } finally { + SC_DEFAULT_IN = tmp + } +} + +/*** META ((export #t)) */ +function sc_withInputFromString(s, thunk) { + return sc_withInputFromPort( + new sc_StringInputPort(sc_string2jsstring(s)), + thunk + ) +} + +/*** META ((export #t)) */ +function sc_withOutputToPort(p, thunk) { + try { + var tmp = SC_DEFAULT_OUT // THREAD: shared var. + SC_DEFAULT_OUT = p + return thunk() + } finally { + SC_DEFAULT_OUT = tmp + } +} + +/*** META ((export #t)) */ +function sc_withOutputToString(thunk) { + var p = new sc_StringOutputPort() + sc_withOutputToPort(p, thunk) + return p.close() +} + +/*** META ((export #t)) */ +function sc_withOutputToProcedure(proc, thunk) { + var t = function (s) { + proc(sc_jsstring2string(s)) + } + return sc_withOutputToPort(new sc_GenericOutputPort(t), thunk) +} + +/*** META ((export #t) + (peephole (hole 0 "new sc_StringOutputPort()"))) +*/ +function sc_openOutputString() { + return new sc_StringOutputPort() +} + +/*** META ((export #t)) */ +function sc_openInputString(str) { + return new sc_StringInputPort(sc_string2jsstring(str)) +} + +/* ----------------------------------------------------------------------------*/ + +function sc_OutputPort() {} +sc_OutputPort.prototype = new sc_Port() +sc_OutputPort.prototype.appendJSString = function (obj) { + /* do nothing */ +} +sc_OutputPort.prototype.close = function () { + /* do nothing */ +} + +function sc_StringOutputPort() { + this.res = '' +} +sc_StringOutputPort.prototype = new sc_OutputPort() +sc_StringOutputPort.prototype.appendJSString = function (s) { + this.res += s +} +sc_StringOutputPort.prototype.close = function () { + return sc_jsstring2string(this.res) +} + +/*** META ((export #t)) */ +function sc_getOutputString(sp) { + return sc_jsstring2string(sp.res) +} + +function sc_ErrorOutputPort() {} +sc_ErrorOutputPort.prototype = new sc_OutputPort() +sc_ErrorOutputPort.prototype.appendJSString = function (s) { + throw "don't write on ErrorPort!" +} +sc_ErrorOutputPort.prototype.close = function () { + /* do nothing */ +} + +function sc_GenericOutputPort(appendJSString, close) { + this.appendJSString = appendJSString + if (close) this.close = close +} +sc_GenericOutputPort.prototype = new sc_OutputPort() + +/*** META ((export #t) + (type bool) + (peephole (postfix " instanceof sc_OutputPort"))) +*/ +function sc_isOutputPort(o) { + return o instanceof sc_OutputPort +} + +/*** META ((export #t) + (peephole (postfix ".close()"))) +*/ +function sc_closeOutputPort(p) { + return p.close() +} + +/* ------------------ write ---------------------------------------------------*/ + +/*** META ((export #t)) */ +function sc_write(o, p) { + if (p === undefined) + // we assume not given + p = SC_DEFAULT_OUT + p.appendJSString(sc_toWriteString(o)) +} + +function sc_toWriteString(o) { + if (o === null) return '()' + else if (o === true) return '#t' + else if (o === false) return '#f' + else if (o === undefined) return '#unspecified' + else if (typeof o === 'function') return '#' + else if (o.sc_toWriteString) return o.sc_toWriteString() + else return o.toString() +} + +function sc_escapeWriteString(s) { + var res = '' + var j = 0 + for (i = 0; i < s.length; i++) { + switch (s.charAt(i)) { + case '\0': + res += s.substring(j, i) + '\\0' + j = i + 1 + break + case '\b': + res += s.substring(j, i) + '\\b' + j = i + 1 + break + case '\f': + res += s.substring(j, i) + '\\f' + j = i + 1 + break + case '\n': + res += s.substring(j, i) + '\\n' + j = i + 1 + break + case '\r': + res += s.substring(j, i) + '\\r' + j = i + 1 + break + case '\t': + res += s.substring(j, i) + '\\t' + j = i + 1 + break + case '\v': + res += s.substring(j, i) + '\\v' + j = i + 1 + break + case '"': + res += s.substring(j, i) + '\\"' + j = i + 1 + break + case '\\': + res += s.substring(j, i) + '\\\\' + j = i + 1 + break + default: + var c = s.charAt(i) + if ('a' !== 'a' && c == 'a') { + res += s.substring(j, i) + '\\a' + j = i + 1 + continue + } + if ('\v' !== 'v' && c == '\v') { + res += s.substring(j, i) + '\\v' + j = i + 1 + continue + } + //if (s.charAt(i) < ' ' || s.charCodeAt(i) > 127) { + // CARE: Manuel is this OK with HOP? + if (s.charAt(i) < ' ') { + /* non printable character and special chars */ + res += s.substring(j, i) + '\\x' + s.charCodeAt(i).toString(16) + j = i + 1 + } + // else just let i increase... + } + } + res += s.substring(j, i) + return res +} + +/* ------------------ display ---------------------------------------------------*/ + +/*** META ((export #t)) */ +function sc_display(o, p) { + if (p === undefined) + // we assume not given + p = SC_DEFAULT_OUT + p.appendJSString(sc_toDisplayString(o)) +} + +function sc_toDisplayString(o) { + if (o === null) return '()' + else if (o === true) return '#t' + else if (o === false) return '#f' + else if (o === undefined) return '#unspecified' + else if (typeof o === 'function') return '#' + else if (o.sc_toDisplayString) return o.sc_toDisplayString() + else return o.toString() +} + +/* ------------------ newline ---------------------------------------------------*/ + +/*** META ((export #t)) */ +function sc_newline(p) { + if (p === undefined) + // we assume not given + p = SC_DEFAULT_OUT + p.appendJSString('\n') +} + +/* ------------------ write-char ---------------------------------------------------*/ + +/*** META ((export #t)) */ +function sc_writeChar(c, p) { + if (p === undefined) + // we assume not given + p = SC_DEFAULT_OUT + p.appendJSString(c.val) +} + +/* ------------------ write-circle ---------------------------------------------------*/ + +/*** META ((export #t)) */ +function sc_writeCircle(o, p) { + if (p === undefined) + // we assume not given + p = SC_DEFAULT_OUT + p.appendJSString(sc_toWriteCircleString(o)) +} + +function sc_toWriteCircleString(o) { + var symb = sc_gensym('writeCircle') + var nbPointer = new Object() + nbPointer.nb = 0 + sc_prepWriteCircle(o, symb, nbPointer) + return sc_genToWriteCircleString(o, symb) +} + +function sc_prepWriteCircle(o, symb, nbPointer) { + // TODO sc_Struct + if (o instanceof sc_Pair || o instanceof sc_Vector) { + if (o[symb] !== undefined) { + // not the first visit. + o[symb]++ + // unless there is already a number, assign one. + if (!o[symb + 'nb']) o[symb + 'nb'] = nbPointer.nb++ + return + } + o[symb] = 0 + if (o instanceof sc_Pair) { + sc_prepWriteCircle(o.car, symb, nbPointer) + sc_prepWriteCircle(o.cdr, symb, nbPointer) + } else { + for (var i = 0; i < o.length; i++) + sc_prepWriteCircle(o[i], symb, nbPointer) + } + } +} + +function sc_genToWriteCircleString(o, symb) { + if (!(o instanceof sc_Pair || o instanceof sc_Vector)) + return sc_toWriteString(o) + return o.sc_toWriteCircleString(symb) +} +sc_Pair.prototype.sc_toWriteCircleString = function (symb, inList) { + if (this[symb + 'use']) { + // use-flag is set. Just use it. + var nb = this[symb + 'nb'] + if (this[symb]-- === 0) { + // if we are the last use. remove all fields. + delete this[symb] + delete this[symb + 'nb'] + delete this[symb + 'use'] + } + if (inList) return '. #' + nb + '#' + else return '#' + nb + '#' + } + if (this[symb]-- === 0) { + // if we are the last use. remove all fields. + delete this[symb] + delete this[symb + 'nb'] + delete this[symb + 'use'] + } + + var res = '' + + if (this[symb] !== undefined) { + // implies > 0 + this[symb + 'use'] = true + if (inList) res += '. #' + this[symb + 'nb'] + '=' + else res += '#' + this[symb + 'nb'] + '=' + inList = false + } + + if (!inList) res += '(' + + // print car + res += sc_genToWriteCircleString(this.car, symb) + + if (sc_isPair(this.cdr)) { + res += ' ' + this.cdr.sc_toWriteCircleString(symb, true) + } else if (this.cdr !== null) { + res += ' . ' + sc_genToWriteCircleString(this.cdr, symb) + } + if (!inList) res += ')' + return res +} +sc_Vector.prototype.sc_toWriteCircleString = function (symb) { + if (this[symb + 'use']) { + // use-flag is set. Just use it. + var nb = this[symb + 'nb'] + if (this[symb]-- === 0) { + // if we are the last use. remove all fields. + delete this[symb] + delete this[symb + 'nb'] + delete this[symb + 'use'] + } + return '#' + nb + '#' + } + if (this[symb]-- === 0) { + // if we are the last use. remove all fields. + delete this[symb] + delete this[symb + 'nb'] + delete this[symb + 'use'] + } + + var res = '' + if (this[symb] !== undefined) { + // implies > 0 + this[symb + 'use'] = true + res += '#' + this[symb + 'nb'] + '=' + } + res += '#(' + for (var i = 0; i < this.length; i++) { + res += sc_genToWriteCircleString(this[i], symb) + if (i < this.length - 1) res += ' ' + } + res += ')' + return res +} + +/* ------------------ print ---------------------------------------------------*/ + +/*** META ((export #t)) */ +function sc_print(s) { + if (arguments.length === 1) { + sc_display(s) + sc_newline() + } else { + for (var i = 0; i < arguments.length; i++) sc_display(arguments[i]) + sc_newline() + } +} + +/* ------------------ format ---------------------------------------------------*/ +/*** META ((export #t)) */ +function sc_format(s, args) { + var len = s.length + var p = new sc_StringOutputPort() + var i = 0, + j = 1 + + while (i < len) { + var i2 = s.indexOf('~', i) + + if (i2 == -1) { + p.appendJSString(s.substring(i, len)) + return p.close() + } else { + if (i2 > i) { + if (i2 == len - 1) { + p.appendJSString(s.substring(i, len)) + return p.close() + } else { + p.appendJSString(s.substring(i, i2)) + i = i2 + } + } + + switch (s.charCodeAt(i2 + 1)) { + case 65: + case 97: + // a + sc_display(arguments[j], p) + i += 2 + j++ + break + + case 83: + case 115: + // s + sc_write(arguments[j], p) + i += 2 + j++ + break + + case 86: + case 118: + // v + sc_display(arguments[j], p) + p.appendJSString('\n') + i += 2 + j++ + break + + case 67: + case 99: + // c + p.appendJSString(String.fromCharCode(arguments[j])) + i += 2 + j++ + break + + case 88: + case 120: + // x + p.appendJSString(arguments[j].toString(6)) + i += 2 + j++ + break + + case 79: + case 111: + // o + p.appendJSString(arguments[j].toString(8)) + i += 2 + j++ + break + + case 66: + case 98: + // b + p.appendJSString(arguments[j].toString(2)) + i += 2 + j++ + break + + case 37: + case 110: + // %, n + p.appendJSString('\n') + i += 2 + break + + case 114: + // r + p.appendJSString('\r') + i += 2 + break + + case 126: + // ~ + p.appendJSString('~') + i += 2 + break + + default: + sc_error( + 'format: illegal ~' + + String.fromCharCode(s.charCodeAt(i2 + 1)) + + ' sequence' + ) + return '' + } + } + } + + return p.close() +} + +/* ------------------ global ports ---------------------------------------------------*/ + +var SC_DEFAULT_IN = new sc_ErrorInputPort() +var SC_DEFAULT_OUT = new sc_ErrorOutputPort() +var SC_ERROR_OUT = new sc_ErrorOutputPort() + +var sc_SYMBOL_PREFIX = '\u1E9C' +var sc_KEYWORD_PREFIX = '\u1E9D' + +/*** META ((export #t) + (peephole (id))) */ +function sc_jsstring2string(s) { + return s +} + +/*** META ((export #t) + (peephole (prefix "'\\u1E9C' +"))) +*/ +function sc_jsstring2symbol(s) { + return sc_SYMBOL_PREFIX + s +} + +/*** META ((export #t) + (peephole (id))) +*/ +function sc_string2jsstring(s) { + return s +} + +/*** META ((export #t) + (peephole (symbol2jsstring_immutable))) +*/ +function sc_symbol2jsstring(s) { + return s.slice(1) +} + +/*** META ((export #t) + (peephole (postfix ".slice(1)"))) +*/ +function sc_keyword2jsstring(k) { + return k.slice(1) +} + +/*** META ((export #t) + (peephole (prefix "'\\u1E9D' +"))) +*/ +function sc_jsstring2keyword(s) { + return sc_KEYWORD_PREFIX + s +} + +/*** META ((export #t) + (type bool)) +*/ +function sc_isKeyword(s) { + return typeof s === 'string' && s.charAt(0) === sc_KEYWORD_PREFIX +} + +/*** META ((export #t)) */ +var sc_gensym = (function () { + var counter = 1000 + return function (sym) { + counter++ + if (!sym) sym = sc_SYMBOL_PREFIX + return sym + 's' + counter + '~' + '^sC-GeNsYm ' + } +})() + +/*** META ((export #t) + (type bool)) +*/ +function sc_isEqual(o1, o2) { + return ( + o1 === o2 || + (sc_isPair(o1) && sc_isPair(o2) && sc_isPairEqual(o1, o2, sc_isEqual)) || + (sc_isVector(o1) && sc_isVector(o2) && sc_isVectorEqual(o1, o2, sc_isEqual)) + ) +} + +/*** META ((export number->symbol integer->symbol)) */ +function sc_number2symbol(x, radix) { + return sc_SYMBOL_PREFIX + sc_number2jsstring(x, radix) +} + +/*** META ((export number->string integer->string)) */ +var sc_number2string = sc_number2jsstring + +/*** META ((export #t)) */ +function sc_symbol2number(s, radix) { + return sc_jsstring2number(s.slice(1), radix) +} + +/*** META ((export #t)) */ +var sc_string2number = sc_jsstring2number + +/*** META ((export #t) + (peephole (prefix "+" s))) + ;; peephole will only apply if no radix is given. +*/ +function sc_string2integer(s, radix) { + if (!radix) return +s + return parseInt(s, radix) +} + +/*** META ((export #t) + (peephole (prefix "+"))) +*/ +function sc_string2real(s) { + return +s +} + +/*** META ((export #t) + (type bool)) +*/ +function sc_isSymbol(s) { + return typeof s === 'string' && s.charAt(0) === sc_SYMBOL_PREFIX +} + +/*** META ((export #t) + (peephole (symbol2string_immutable))) +*/ +function sc_symbol2string(s) { + return s.slice(1) +} + +/*** META ((export #t) + (peephole (prefix "'\\u1E9C' +"))) +*/ +function sc_string2symbol(s) { + return sc_SYMBOL_PREFIX + s +} + +/*** META ((export symbol-append) + (peephole (symbolAppend_immutable))) +*/ +function sc_symbolAppend() { + var res = sc_SYMBOL_PREFIX + for (var i = 0; i < arguments.length; i++) res += arguments[i].slice(1) + return res +} + +/*** META ((export #t) + (peephole (postfix ".val"))) +*/ +function sc_char2string(c) { + return c.val +} + +/*** META ((export #t) + (peephole (hole 1 "'\\u1E9C' + " c ".val"))) +*/ +function sc_char2symbol(c) { + return sc_SYMBOL_PREFIX + c.val +} + +/*** META ((export #t) + (type bool)) +*/ +function sc_isString(s) { + return typeof s === 'string' && s.charAt(0) !== sc_SYMBOL_PREFIX +} + +/*** META ((export #t)) */ +var sc_makeString = sc_makejsString + +/*** META ((export #t)) */ +function sc_string() { + for (var i = 0; i < arguments.length; i++) arguments[i] = arguments[i].val + return ''.concat.apply('', arguments) +} + +/*** META ((export #t) + (peephole (postfix ".length"))) +*/ +function sc_stringLength(s) { + return s.length +} + +/*** META ((export #t)) */ +function sc_stringRef(s, k) { + return new sc_Char(s.charAt(k)) +} + +/* there's no stringSet in the immutable version +function sc_stringSet(s, k, c) +*/ + +/*** META ((export string=?) + (type bool) + (peephole (hole 2 str1 " === " str2))) +*/ +function sc_isStringEqual(s1, s2) { + return s1 === s2 +} +/*** META ((export string?) + (type bool) + (peephole (hole 2 str1 " > " str2))) +*/ +function sc_isStringGreater(s1, s2) { + return s1 > s2 +} +/*** META ((export string<=?) + (type bool) + (peephole (hole 2 str1 " <= " str2))) +*/ +function sc_isStringLessEqual(s1, s2) { + return s1 <= s2 +} +/*** META ((export string>=?) + (type bool) + (peephole (hole 2 str1 " >= " str2))) +*/ +function sc_isStringGreaterEqual(s1, s2) { + return s1 >= s2 +} +/*** META ((export string-ci=?) + (type bool) + (peephole (hole 2 str1 ".toLowerCase() === " str2 ".toLowerCase()"))) +*/ +function sc_isStringCIEqual(s1, s2) { + return s1.toLowerCase() === s2.toLowerCase() +} +/*** META ((export string-ci?) + (type bool) + (peephole (hole 2 str1 ".toLowerCase() > " str2 ".toLowerCase()"))) +*/ +function sc_isStringCIGreater(s1, s2) { + return s1.toLowerCase() > s2.toLowerCase() +} +/*** META ((export string-ci<=?) + (type bool) + (peephole (hole 2 str1 ".toLowerCase() <= " str2 ".toLowerCase()"))) +*/ +function sc_isStringCILessEqual(s1, s2) { + return s1.toLowerCase() <= s2.toLowerCase() +} +/*** META ((export string-ci>=?) + (type bool) + (peephole (hole 2 str1 ".toLowerCase() >= " str2 ".toLowerCase()"))) +*/ +function sc_isStringCIGreaterEqual(s1, s2) { + return s1.toLowerCase() >= s2.toLowerCase() +} + +/*** META ((export #t) + (peephole (hole 3 s ".substring(" start ", " end ")"))) +*/ +function sc_substring(s, start, end) { + return s.substring(start, end) +} + +/*** META ((export #t)) + */ +function sc_isSubstring_at(s1, s2, i) { + return s2 == s1.substring(i, i + s2.length) +} + +/*** META ((export #t) + (peephole (infix 0 #f "+" "''"))) +*/ +function sc_stringAppend() { + return ''.concat.apply('', arguments) +} + +/*** META ((export #t)) */ +var sc_string2list = sc_jsstring2list + +/*** META ((export #t)) */ +var sc_list2string = sc_list2jsstring + +/*** META ((export #t) + (peephole (id))) +*/ +function sc_stringCopy(s) { + return s +} + +/* there's no string-fill in the immutable version +function sc_stringFill(s, c) +*/ + +/*** META ((export #t) + (peephole (postfix ".slice(1)"))) +*/ +function sc_keyword2string(o) { + return o.slice(1) +} + +/*** META ((export #t) + (peephole (prefix "'\\u1E9D' +"))) +*/ +function sc_string2keyword(o) { + return sc_KEYWORD_PREFIX + o +} + +String.prototype.sc_toDisplayString = function () { + if (this.charAt(0) === sc_SYMBOL_PREFIX) + // TODO: care for symbols with spaces (escape-chars symbols). + return this.slice(1) + else if (this.charAt(0) === sc_KEYWORD_PREFIX) return ':' + this.slice(1) + else return this.toString() +} + +String.prototype.sc_toWriteString = function () { + if (this.charAt(0) === sc_SYMBOL_PREFIX) + // TODO: care for symbols with spaces (escape-chars symbols). + return this.slice(1) + else if (this.charAt(0) === sc_KEYWORD_PREFIX) return ':' + this.slice(1) + else return '"' + sc_escapeWriteString(this) + '"' +} +/* Exported Variables */ +var BgL_testzd2boyerzd2 +var BgL_nboyerzd2benchmarkzd2 +var BgL_setupzd2boyerzd2 +/* End Exports */ + +var translate_term_nboyer +var translate_args_nboyer +var untranslate_term_nboyer +var BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer +var BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer +var translate_alist_nboyer +var apply_subst_nboyer +var apply_subst_lst_nboyer +var tautologyp_nboyer +var if_constructor_nboyer +var rewrite_count_nboyer +var rewrite_nboyer +var rewrite_args_nboyer +var unify_subst_nboyer +var one_way_unify1_nboyer +var false_term_nboyer +var true_term_nboyer +var trans_of_implies1_nboyer +var is_term_equal_nboyer +var is_term_member_nboyer +var const_nboyer +var sc_const_3_nboyer +var sc_const_4_nboyer +{ + sc_const_4_nboyer = new sc_Pair( + '\u1E9Cimplies', + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cimplies', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cimplies', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cimplies', + new sc_Pair('\u1E9Cz', new sc_Pair('\u1E9Cu', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cimplies', + new sc_Pair('\u1E9Cu', new sc_Pair('\u1E9Cw', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cimplies', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cw', null)) + ), + null + ) + ) + ) + sc_const_3_nboyer = sc_list( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Ccompile', new sc_Pair('\u1E9Cform', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Creverse', + new sc_Pair( + new sc_Pair( + '\u1E9Ccodegen', + new sc_Pair( + new sc_Pair( + '\u1E9Coptimize', + new sc_Pair('\u1E9Cform', null) + ), + new sc_Pair(new sc_Pair('\u1E9Cnil', null), null) + ) + ), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ceqp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cgreaterp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cx', null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clesseqp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cx', null)) + ), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cgreatereqp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cboolean', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cx', + new sc_Pair(new sc_Pair('\u1E9Ct', null), null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cx', + new sc_Pair(new sc_Pair('\u1E9Cf', null), null) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ciff', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cimplies', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cimplies', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cx', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Ceven1', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair('\u1E9Ct', null), + new sc_Pair( + new sc_Pair( + '\u1E9Codd', + new sc_Pair( + new sc_Pair('\u1E9Csub1', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ccountps-', + new sc_Pair('\u1E9Cl', new sc_Pair('\u1E9Cpred', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ccountps-loop', + new sc_Pair( + '\u1E9Cl', + new sc_Pair( + '\u1E9Cpred', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cfact-', new sc_Pair('\u1E9Ci', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cfact-loop', + new sc_Pair('\u1E9Ci', new sc_Pair(1, null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Creverse-', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Creverse-loop', + new sc_Pair( + '\u1E9Cx', + new sc_Pair(new sc_Pair('\u1E9Cnil', null), null) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cdivides', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Czerop', + new sc_Pair( + new sc_Pair( + '\u1E9Cremainder', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cx', null)) + ), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cassume-true', + new sc_Pair('\u1E9Cvar', new sc_Pair('\u1E9Calist', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + '\u1E9Cvar', + new sc_Pair(new sc_Pair('\u1E9Ct', null), null) + ) + ), + new sc_Pair('\u1E9Calist', null) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cassume-false', + new sc_Pair('\u1E9Cvar', new sc_Pair('\u1E9Calist', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + '\u1E9Cvar', + new sc_Pair(new sc_Pair('\u1E9Cf', null), null) + ) + ), + new sc_Pair('\u1E9Calist', null) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Ctautology-checker', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Ctautologyp', + new sc_Pair( + new sc_Pair('\u1E9Cnormalize', new sc_Pair('\u1E9Cx', null)), + new sc_Pair(new sc_Pair('\u1E9Cnil', null), null) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cfalsify', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cfalsify1', + new sc_Pair( + new sc_Pair('\u1E9Cnormalize', new sc_Pair('\u1E9Cx', null)), + new sc_Pair(new sc_Pair('\u1E9Cnil', null), null) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cprime', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Cadd1', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ), + null + ) + ) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cprime1', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair('\u1E9Csub1', new sc_Pair('\u1E9Cx', null)), + null + ) + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair('\u1E9Cp', new sc_Pair('\u1E9Cq', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Cp', + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Cq', + new sc_Pair( + new sc_Pair('\u1E9Ct', null), + new sc_Pair(new sc_Pair('\u1E9Cf', null), null) + ) + ) + ), + new sc_Pair(new sc_Pair('\u1E9Cf', null), null) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair('\u1E9Cp', new sc_Pair('\u1E9Cq', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Cp', + new sc_Pair( + new sc_Pair('\u1E9Ct', null), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Cq', + new sc_Pair( + new sc_Pair('\u1E9Ct', null), + new sc_Pair(new sc_Pair('\u1E9Cf', null), null) + ) + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cnot', new sc_Pair('\u1E9Cp', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Cp', + new sc_Pair( + new sc_Pair('\u1E9Cf', null), + new sc_Pair(new sc_Pair('\u1E9Ct', null), null) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cimplies', + new sc_Pair('\u1E9Cp', new sc_Pair('\u1E9Cq', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Cp', + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Cq', + new sc_Pair( + new sc_Pair('\u1E9Ct', null), + new sc_Pair(new sc_Pair('\u1E9Cf', null), null) + ) + ) + ), + new sc_Pair(new sc_Pair('\u1E9Ct', null), null) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair('\u1E9Cnumberp', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + '\u1E9Cx', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Ca', + new sc_Pair('\u1E9Cb', new sc_Pair('\u1E9Cc', null)) + ) + ), + new sc_Pair('\u1E9Cd', new sc_Pair('\u1E9Ce', null)) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Ca', + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Cb', + new sc_Pair('\u1E9Cd', new sc_Pair('\u1E9Ce', null)) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + '\u1E9Cc', + new sc_Pair('\u1E9Cd', new sc_Pair('\u1E9Ce', null)) + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cx', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair('\u1E9Cnumberp', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair('\u1E9Cz', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Ca', null)), + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cb', null)), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cx', null)) + ), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cc', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cb', null)), + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cc', null)), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Czero', null), + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cx', null)) + ), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair('\u1E9Cnumberp', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cx', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cmeaning', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus-tree', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ), + new sc_Pair('\u1E9Ca', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + new sc_Pair( + '\u1E9Cmeaning', + new sc_Pair( + new sc_Pair('\u1E9Cplus-tree', new sc_Pair('\u1E9Cx', null)), + new sc_Pair('\u1E9Ca', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cmeaning', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus-tree', + new sc_Pair('\u1E9Cy', null) + ), + new sc_Pair('\u1E9Ca', null) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cmeaning', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus-tree', + new sc_Pair( + new sc_Pair('\u1E9Cplus-fringe', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + new sc_Pair('\u1E9Ca', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cfix', + new sc_Pair( + new sc_Pair( + '\u1E9Cmeaning', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Ca', null)) + ), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair('\u1E9Cz', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Creverse', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair( + new sc_Pair('\u1E9Creverse', new sc_Pair('\u1E9Cb', null)), + new sc_Pair( + new sc_Pair('\u1E9Creverse', new sc_Pair('\u1E9Ca', null)), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair('\u1E9Cz', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cexec', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair('\u1E9Cpds', new sc_Pair('\u1E9Cenvrn', null)) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cexec', + new sc_Pair( + '\u1E9Cy', + new sc_Pair( + new sc_Pair( + '\u1E9Cexec', + new sc_Pair( + '\u1E9Cx', + new sc_Pair('\u1E9Cpds', new sc_Pair('\u1E9Cenvrn', null)) + ) + ), + new sc_Pair('\u1E9Cenvrn', null) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cmc-flatten', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair( + new sc_Pair('\u1E9Cflatten', new sc_Pair('\u1E9Cx', null)), + new sc_Pair('\u1E9Cy', null) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Ca', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cb', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair('\u1E9Creverse', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clength', + new sc_Pair( + new sc_Pair('\u1E9Creverse', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Clength', new sc_Pair('\u1E9Cx', null)), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair( + '\u1E9Ca', + new sc_Pair( + new sc_Pair( + '\u1E9Cintersect', + new sc_Pair('\u1E9Cb', new sc_Pair('\u1E9Cc', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cc', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cnth', + new sc_Pair( + new sc_Pair('\u1E9Czero', null), + new sc_Pair('\u1E9Ci', null) + ) + ), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cexp', + new sc_Pair( + '\u1E9Ci', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cj', new sc_Pair('\u1E9Ck', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + new sc_Pair( + '\u1E9Cexp', + new sc_Pair('\u1E9Ci', new sc_Pair('\u1E9Cj', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cexp', + new sc_Pair('\u1E9Ci', new sc_Pair('\u1E9Ck', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cexp', + new sc_Pair( + '\u1E9Ci', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cj', new sc_Pair('\u1E9Ck', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cexp', + new sc_Pair( + new sc_Pair( + '\u1E9Cexp', + new sc_Pair('\u1E9Ci', new sc_Pair('\u1E9Cj', null)) + ), + new sc_Pair('\u1E9Ck', null) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Creverse-loop', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair( + new sc_Pair('\u1E9Creverse', new sc_Pair('\u1E9Cx', null)), + new sc_Pair('\u1E9Cy', null) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Creverse-loop', + new sc_Pair( + '\u1E9Cx', + new sc_Pair(new sc_Pair('\u1E9Cnil', null), null) + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Creverse', new sc_Pair('\u1E9Cx', null)), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ccount-list', + new sc_Pair( + '\u1E9Cz', + new sc_Pair( + new sc_Pair( + '\u1E9Csort-lp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + new sc_Pair( + '\u1E9Ccount-list', + new sc_Pair('\u1E9Cz', new sc_Pair('\u1E9Cx', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ccount-list', + new sc_Pair('\u1E9Cz', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cc', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair('\u1E9Cb', new sc_Pair('\u1E9Cc', null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + new sc_Pair( + '\u1E9Cremainder', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + '\u1E9Cy', + new sc_Pair( + new sc_Pair( + '\u1E9Cquotient', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cx', null)), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cpower-eval', + new sc_Pair( + new sc_Pair( + '\u1E9Cbig-plus1', + new sc_Pair( + '\u1E9Cl', + new sc_Pair('\u1E9Ci', new sc_Pair('\u1E9Cbase', null)) + ) + ), + new sc_Pair('\u1E9Cbase', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + new sc_Pair( + '\u1E9Cpower-eval', + new sc_Pair('\u1E9Cl', new sc_Pair('\u1E9Cbase', null)) + ), + new sc_Pair('\u1E9Ci', null) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cpower-eval', + new sc_Pair( + new sc_Pair( + '\u1E9Cbig-plus', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + '\u1E9Cy', + new sc_Pair('\u1E9Ci', new sc_Pair('\u1E9Cbase', null)) + ) + ) + ), + new sc_Pair('\u1E9Cbase', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + '\u1E9Ci', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + new sc_Pair( + '\u1E9Cpower-eval', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cbase', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cpower-eval', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cbase', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cremainder', + new sc_Pair('\u1E9Cy', new sc_Pair(1, null)) + ), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair( + new sc_Pair( + '\u1E9Cremainder', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair('\u1E9Cy', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cy', null)), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cremainder', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cx', null)) + ), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair( + new sc_Pair( + '\u1E9Cquotient', + new sc_Pair('\u1E9Ci', new sc_Pair('\u1E9Cj', null)) + ), + new sc_Pair('\u1E9Ci', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Ci', null)), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cj', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair('\u1E9Cj', new sc_Pair(1, null)) + ), + null + ) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair( + new sc_Pair( + '\u1E9Cremainder', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair('\u1E9Cx', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cy', null)), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cpower-eval', + new sc_Pair( + new sc_Pair( + '\u1E9Cpower-rep', + new sc_Pair('\u1E9Ci', new sc_Pair('\u1E9Cbase', null)) + ), + new sc_Pair('\u1E9Cbase', null) + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Ci', null)), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cpower-eval', + new sc_Pair( + new sc_Pair( + '\u1E9Cbig-plus', + new sc_Pair( + new sc_Pair( + '\u1E9Cpower-rep', + new sc_Pair('\u1E9Ci', new sc_Pair('\u1E9Cbase', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cpower-rep', + new sc_Pair('\u1E9Cj', new sc_Pair('\u1E9Cbase', null)) + ), + new sc_Pair( + new sc_Pair('\u1E9Czero', null), + new sc_Pair('\u1E9Cbase', null) + ) + ) + ) + ), + new sc_Pair('\u1E9Cbase', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Ci', new sc_Pair('\u1E9Cj', null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cgcd', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cgcd', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cx', null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cnth', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair('\u1E9Ci', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair( + new sc_Pair( + '\u1E9Cnth', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Ci', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnth', + new sc_Pair( + '\u1E9Cb', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair( + '\u1E9Ci', + new sc_Pair( + new sc_Pair( + '\u1E9Clength', + new sc_Pair('\u1E9Ca', null) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair('\u1E9Cx', null) + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cx', null)) + ), + new sc_Pair('\u1E9Cx', null) + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair('\u1E9Cc', new sc_Pair('\u1E9Cw', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cc', new sc_Pair('\u1E9Cx', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cw', new sc_Pair('\u1E9Cx', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cremainder', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cz', null)) + ), + new sc_Pair('\u1E9Cz', null) + ) + ), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + '\u1E9Cb', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cc', null)) + ), + null + ) + ) + ), + new sc_Pair('\u1E9Ca', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cb', new sc_Pair('\u1E9Cc', null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair( + new sc_Pair( + '\u1E9Cadd1', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ), + new sc_Pair('\u1E9Cz', null) + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Cadd1', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cz', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cz', null)), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair( + '\u1E9Cy', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cgcd', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cz', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + '\u1E9Cz', + new sc_Pair( + new sc_Pair( + '\u1E9Cgcd', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cvalue', + new sc_Pair( + new sc_Pair('\u1E9Cnormalize', new sc_Pair('\u1E9Cx', null)), + new sc_Pair('\u1E9Ca', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cvalue', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Ca', null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cflatten', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + '\u1E9Cy', + new sc_Pair(new sc_Pair('\u1E9Cnil', null), null) + ) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair('\u1E9Cnlistp', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clistp', + new sc_Pair( + new sc_Pair('\u1E9Cgopher', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Clistp', new sc_Pair('\u1E9Cx', null)), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Csamefringe', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cflatten', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair('\u1E9Cflatten', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cgreatest-factor', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cy', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair('\u1E9Cy', new sc_Pair(1, null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cx', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cgreatest-factor', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair(1, null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair('\u1E9Cx', new sc_Pair(1, null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cnumberp', + new sc_Pair( + new sc_Pair( + '\u1E9Cgreatest-factor', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cy', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair('\u1E9Cy', new sc_Pair(1, null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Cnumberp', + new sc_Pair('\u1E9Cx', null) + ), + null + ) + ), + null + ) + ) + ), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes-list', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + new sc_Pair('\u1E9Ctimes-list', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair('\u1E9Ctimes-list', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cprime-list', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair('\u1E9Cprime-list', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair('\u1E9Cprime-list', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cz', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cw', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair('\u1E9Cnumberp', new sc_Pair('\u1E9Cz', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cz', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair('\u1E9Cw', new sc_Pair(1, null)) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cgreatereqp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cor', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cx', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cand', + new sc_Pair( + new sc_Pair('\u1E9Cnumberp', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair('\u1E9Cy', new sc_Pair(1, null)) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cremainder', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cx', null)) + ), + new sc_Pair('\u1E9Cy', null) + ) + ), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair(1, null) + ) + ), + new sc_Pair( + sc_list( + '\u1E9Cand', + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Ca', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + null + ) + ), + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + '\u1E9Cb', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + null + ) + ), + new sc_Pair('\u1E9Cnumberp', new sc_Pair('\u1E9Ca', null)), + new sc_Pair('\u1E9Cnumberp', new sc_Pair('\u1E9Cb', null)), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Csub1', new sc_Pair('\u1E9Ca', null)), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Csub1', new sc_Pair('\u1E9Cb', null)), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair( + new sc_Pair( + '\u1E9Clength', + new sc_Pair( + new sc_Pair( + '\u1E9Cdelete', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cl', null)) + ), + null + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Clength', new sc_Pair('\u1E9Cl', null)), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cl', null)) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Csort2', + new sc_Pair( + new sc_Pair( + '\u1E9Cdelete', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cl', null)) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cdelete', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair('\u1E9Csort2', new sc_Pair('\u1E9Cl', null)), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cdsort', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair('\u1E9Csort2', new sc_Pair('\u1E9Cx', null)), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clength', + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + '\u1E9Cx1', + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + '\u1E9Cx2', + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + '\u1E9Cx3', + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + '\u1E9Cx4', + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + '\u1E9Cx5', + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + '\u1E9Cx6', + new sc_Pair('\u1E9Cx7', null) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + 6, + new sc_Pair( + new sc_Pair('\u1E9Clength', new sc_Pair('\u1E9Cx7', null)), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair( + new sc_Pair( + '\u1E9Cadd1', + new sc_Pair( + new sc_Pair('\u1E9Cadd1', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + new sc_Pair(2, null) + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cx', null)), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cquotient', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + new sc_Pair(2, null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Cquotient', + new sc_Pair('\u1E9Cy', new sc_Pair(2, null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Csigma', + new sc_Pair( + new sc_Pair('\u1E9Czero', null), + new sc_Pair('\u1E9Ci', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cquotient', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + '\u1E9Ci', + new sc_Pair( + new sc_Pair('\u1E9Cadd1', new sc_Pair('\u1E9Ci', null)), + null + ) + ) + ), + new sc_Pair(2, null) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair('\u1E9Cadd1', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair('\u1E9Cnumberp', new sc_Pair('\u1E9Cy', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cadd1', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Cadd1', new sc_Pair('\u1E9Cx', null)), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair('\u1E9Cz', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cz', null)) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cz', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cnot', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair( + '\u1E9Cy', + new sc_Pair('\u1E9Cx', null) + ) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cfix', + new sc_Pair('\u1E9Cx', null) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cfix', + new sc_Pair('\u1E9Cz', null) + ), + null + ) + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cmeaning', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus-tree', + new sc_Pair( + new sc_Pair( + '\u1E9Cdelete', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ), + new sc_Pair('\u1E9Ca', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair( + new sc_Pair( + '\u1E9Cmeaning', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus-tree', + new sc_Pair('\u1E9Cy', null) + ), + new sc_Pair('\u1E9Ca', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cmeaning', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Ca', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cmeaning', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus-tree', + new sc_Pair('\u1E9Cy', null) + ), + new sc_Pair('\u1E9Ca', null) + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair('\u1E9Cadd1', new sc_Pair('\u1E9Cy', null)), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair('\u1E9Cnumberp', new sc_Pair('\u1E9Cy', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cx', null)), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cnth', + new sc_Pair( + new sc_Pair('\u1E9Cnil', null), + new sc_Pair('\u1E9Ci', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Ci', null)), + new sc_Pair( + new sc_Pair('\u1E9Cnil', null), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clast', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair('\u1E9Clistp', new sc_Pair('\u1E9Cb', null)), + new sc_Pair( + new sc_Pair('\u1E9Clast', new sc_Pair('\u1E9Cb', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair('\u1E9Clistp', new sc_Pair('\u1E9Ca', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + new sc_Pair( + '\u1E9Ccar', + new sc_Pair( + new sc_Pair( + '\u1E9Clast', + new sc_Pair('\u1E9Ca', null) + ), + null + ) + ), + new sc_Pair('\u1E9Cb', null) + ) + ), + new sc_Pair('\u1E9Cb', null) + ) + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair('\u1E9Cz', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair( + '\u1E9Clessp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Ct', null), + new sc_Pair('\u1E9Cz', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair('\u1E9Cf', null), + new sc_Pair('\u1E9Cz', null) + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cassignment', + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair( + '\u1E9Cassignedp', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Ca', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cassignment', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Ca', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cassignment', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cb', null)) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Ccar', + new sc_Pair( + new sc_Pair('\u1E9Cgopher', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair('\u1E9Clistp', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Ccar', + new sc_Pair( + new sc_Pair('\u1E9Cflatten', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cflatten', + new sc_Pair( + new sc_Pair( + '\u1E9Ccdr', + new sc_Pair( + new sc_Pair('\u1E9Cgopher', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair('\u1E9Clistp', new sc_Pair('\u1E9Cx', null)), + new sc_Pair( + new sc_Pair( + '\u1E9Ccdr', + new sc_Pair( + new sc_Pair('\u1E9Cflatten', new sc_Pair('\u1E9Cx', null)), + null + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Ccons', + new sc_Pair( + new sc_Pair('\u1E9Czero', null), + new sc_Pair(new sc_Pair('\u1E9Cnil', null), null) + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cquotient', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Cy', new sc_Pair('\u1E9Cx', null)) + ), + new sc_Pair('\u1E9Cy', null) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair('\u1E9Czerop', new sc_Pair('\u1E9Cy', null)), + new sc_Pair( + new sc_Pair('\u1E9Czero', null), + new sc_Pair( + new sc_Pair('\u1E9Cfix', new sc_Pair('\u1E9Cx', null)), + null + ) + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cget', + new sc_Pair( + '\u1E9Cj', + new sc_Pair( + new sc_Pair( + '\u1E9Cset', + new sc_Pair( + '\u1E9Ci', + new sc_Pair('\u1E9Cval', new sc_Pair('\u1E9Cmem', null)) + ) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cif', + new sc_Pair( + new sc_Pair( + '\u1E9Ceqp', + new sc_Pair('\u1E9Cj', new sc_Pair('\u1E9Ci', null)) + ), + new sc_Pair( + '\u1E9Cval', + new sc_Pair( + new sc_Pair( + '\u1E9Cget', + new sc_Pair('\u1E9Cj', new sc_Pair('\u1E9Cmem', null)) + ), + null + ) + ) + ) + ), + null + ) + ) + ) + ) + const_nboyer = new sc_Pair( + new sc_Pair( + '\u1E9Cx', + new sc_Pair( + '\u1E9Cf', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair( + '\u1E9Cc', + new sc_Pair(new sc_Pair('\u1E9Czero', null), null) + ) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cy', + new sc_Pair( + '\u1E9Cf', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair( + new sc_Pair( + '\u1E9Ctimes', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Cc', new sc_Pair('\u1E9Cd', null)) + ), + null + ) + ) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cz', + new sc_Pair( + '\u1E9Cf', + new sc_Pair( + new sc_Pair( + '\u1E9Creverse', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair( + new sc_Pair( + '\u1E9Cappend', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair(new sc_Pair('\u1E9Cnil', null), null) + ) + ), + null + ) + ), + null + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cu', + new sc_Pair( + '\u1E9Cequal', + new sc_Pair( + new sc_Pair( + '\u1E9Cplus', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cdifference', + new sc_Pair('\u1E9Cx', new sc_Pair('\u1E9Cy', null)) + ), + null + ) + ) + ) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cw', + new sc_Pair( + '\u1E9Clessp', + new sc_Pair( + new sc_Pair( + '\u1E9Cremainder', + new sc_Pair('\u1E9Ca', new sc_Pair('\u1E9Cb', null)) + ), + new sc_Pair( + new sc_Pair( + '\u1E9Cmember', + new sc_Pair( + '\u1E9Ca', + new sc_Pair( + new sc_Pair( + '\u1E9Clength', + new sc_Pair('\u1E9Cb', null) + ), + null + ) + ) + ), + null + ) + ) + ) + ), + null + ) + ) + ) + ) + ) + BgL_nboyerzd2benchmarkzd2 = function () { + var args = null + for (var sc_tmp = arguments.length - 1; sc_tmp >= 0; sc_tmp--) { + args = sc_cons(arguments[sc_tmp], args) + } + var n + return ( + (n = args === null ? 0 : args.car), + BgL_setupzd2boyerzd2(), + BgL_runzd2benchmarkzd2( + 'nboyer' + sc_number2string(n), + 1, + function () { + return BgL_testzd2boyerzd2(n) + }, + function (rewrites) { + if (sc_isNumber(rewrites)) + switch (n) { + case 0: + return rewrites === 95024 + break + case 1: + return rewrites === 591777 + break + case 2: + return rewrites === 1813975 + break + case 3: + return rewrites === 5375678 + break + case 4: + return rewrites === 16445406 + break + case 5: + return rewrites === 51507739 + break + default: + return true + break + } + else return false + } + ) + ) + } + BgL_setupzd2boyerzd2 = function () { + return true + } + BgL_testzd2boyerzd2 = function () { + return true + } + translate_term_nboyer = function (term) { + var lst + return !(term instanceof sc_Pair) + ? term + : new sc_Pair( + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(term.car), + ((lst = term.cdr), + lst === null + ? null + : new sc_Pair( + translate_term_nboyer(lst.car), + translate_args_nboyer(lst.cdr) + )) + ) + } + translate_args_nboyer = function (lst) { + var sc_lst_5 + var term + return lst === null + ? null + : new sc_Pair( + ((term = lst.car), + !(term instanceof sc_Pair) + ? term + : new sc_Pair( + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(term.car), + translate_args_nboyer(term.cdr) + )), + ((sc_lst_5 = lst.cdr), + sc_lst_5 === null + ? null + : new sc_Pair( + translate_term_nboyer(sc_lst_5.car), + translate_args_nboyer(sc_lst_5.cdr) + )) + ) + } + untranslate_term_nboyer = function (term) { + var optrOpnd + var tail1131 + var L1127 + var falseHead1130 + var symbol_record + if (!(term instanceof sc_Pair)) return term + else { + falseHead1130 = new sc_Pair(null, null) + L1127 = term.cdr + tail1131 = falseHead1130 + while (!(L1127 === null)) { + { + tail1131.cdr = new sc_Pair(untranslate_term_nboyer(L1127.car), null) + tail1131 = tail1131.cdr + L1127 = L1127.cdr + } + } + optrOpnd = falseHead1130.cdr + return new sc_Pair( + ((symbol_record = term.car), symbol_record[0]), + optrOpnd + ) + } + } + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer = function (sym) { + var r + var x + return ( + (x = sc_assq(sym, BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer)), + x !== false + ? x.cdr + : ((r = [sym, null]), + (BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer = new sc_Pair( + new sc_Pair(sym, r), + BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer + )), + r) + ) + } + BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer = null + translate_alist_nboyer = function (alist) { + var sc_alist_6 + var term + return alist === null + ? null + : new sc_Pair( + new sc_Pair( + alist.car.car, + ((term = alist.car.cdr), + !(term instanceof sc_Pair) + ? term + : new sc_Pair( + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(term.car), + translate_args_nboyer(term.cdr) + )) + ), + ((sc_alist_6 = alist.cdr), + sc_alist_6 === null + ? null + : new sc_Pair( + new sc_Pair( + sc_alist_6.car.car, + translate_term_nboyer(sc_alist_6.car.cdr) + ), + translate_alist_nboyer(sc_alist_6.cdr) + )) + ) + } + apply_subst_nboyer = function (alist, term) { + var lst + var temp_temp + return !(term instanceof sc_Pair) + ? ((temp_temp = sc_assq(term, alist)), + temp_temp !== false ? temp_temp.cdr : term) + : new sc_Pair( + term.car, + ((lst = term.cdr), + lst === null + ? null + : new sc_Pair( + apply_subst_nboyer(alist, lst.car), + apply_subst_lst_nboyer(alist, lst.cdr) + )) + ) + } + apply_subst_lst_nboyer = function (alist, lst) { + var sc_lst_7 + return lst === null + ? null + : new sc_Pair( + apply_subst_nboyer(alist, lst.car), + ((sc_lst_7 = lst.cdr), + sc_lst_7 === null + ? null + : new sc_Pair( + apply_subst_nboyer(alist, sc_lst_7.car), + apply_subst_lst_nboyer(alist, sc_lst_7.cdr) + )) + ) + } + tautologyp_nboyer = function (sc_x_11, true_lst, false_lst) { + var tmp1125 + var x + var tmp1126 + var sc_x_8 + var sc_tmp1125_9 + var sc_tmp1126_10 + var sc_x_11 + var true_lst + var false_lst + while (true) { + if ( + ((sc_tmp1126_10 = is_term_equal_nboyer(sc_x_11, true_term_nboyer)), + sc_tmp1126_10 !== false + ? sc_tmp1126_10 + : is_term_member_nboyer(sc_x_11, true_lst)) !== false + ) + return true + else if ( + ((sc_tmp1125_9 = is_term_equal_nboyer(sc_x_11, false_term_nboyer)), + sc_tmp1125_9 !== false + ? sc_tmp1125_9 + : is_term_member_nboyer(sc_x_11, false_lst)) !== false + ) + return false + else if (!(sc_x_11 instanceof sc_Pair)) return false + else if (sc_x_11.car === if_constructor_nboyer) + if ( + ((sc_x_8 = sc_x_11.cdr.car), + (tmp1126 = is_term_equal_nboyer(sc_x_8, true_term_nboyer)), + tmp1126 !== false + ? tmp1126 + : is_term_member_nboyer(sc_x_8, true_lst)) !== false + ) + sc_x_11 = sc_x_11.cdr.cdr.car + else if ( + ((x = sc_x_11.cdr.car), + (tmp1125 = is_term_equal_nboyer(x, false_term_nboyer)), + tmp1125 !== false ? tmp1125 : is_term_member_nboyer(x, false_lst)) !== + false + ) + sc_x_11 = sc_x_11.cdr.cdr.cdr.car + else if ( + tautologyp_nboyer( + sc_x_11.cdr.cdr.car, + new sc_Pair(sc_x_11.cdr.car, true_lst), + false_lst + ) !== false + ) { + false_lst = new sc_Pair(sc_x_11.cdr.car, false_lst) + sc_x_11 = sc_x_11.cdr.cdr.cdr.car + } else return false + else return false + } + } + if_constructor_nboyer = '\u1E9C*' + rewrite_count_nboyer = 0 + rewrite_nboyer = function (term) { + var term2 + var sc_term_12 + var lst + var symbol_record + var sc_lst_13 + { + ++rewrite_count_nboyer + if (!(term instanceof sc_Pair)) return term + else { + sc_term_12 = new sc_Pair( + term.car, + ((sc_lst_13 = term.cdr), + sc_lst_13 === null + ? null + : new sc_Pair( + rewrite_nboyer(sc_lst_13.car), + rewrite_args_nboyer(sc_lst_13.cdr) + )) + ) + lst = ((symbol_record = term.car), symbol_record[1]) + while (true) { + if (lst === null) return sc_term_12 + else if ( + ((term2 = lst.car.cdr.car), + (unify_subst_nboyer = null), + one_way_unify1_nboyer(sc_term_12, term2)) !== false + ) + return rewrite_nboyer( + apply_subst_nboyer(unify_subst_nboyer, lst.car.cdr.cdr.car) + ) + else lst = lst.cdr + } + } + } + } + rewrite_args_nboyer = function (lst) { + var sc_lst_14 + return lst === null + ? null + : new sc_Pair( + rewrite_nboyer(lst.car), + ((sc_lst_14 = lst.cdr), + sc_lst_14 === null + ? null + : new sc_Pair( + rewrite_nboyer(sc_lst_14.car), + rewrite_args_nboyer(sc_lst_14.cdr) + )) + ) + } + unify_subst_nboyer = '\u1E9C*' + one_way_unify1_nboyer = function (term1, term2) { + var lst1 + var lst2 + var temp_temp + if (!(term2 instanceof sc_Pair)) { + temp_temp = sc_assq(term2, unify_subst_nboyer) + if (temp_temp !== false) return is_term_equal_nboyer(term1, temp_temp.cdr) + else if (sc_isNumber(term2)) return sc_isEqual(term1, term2) + else { + unify_subst_nboyer = new sc_Pair( + new sc_Pair(term2, term1), + unify_subst_nboyer + ) + return true + } + } else if (!(term1 instanceof sc_Pair)) return false + else if (term1.car === term2.car) { + lst1 = term1.cdr + lst2 = term2.cdr + while (true) { + if (lst1 === null) return lst2 === null + else if (lst2 === null) return false + else if (one_way_unify1_nboyer(lst1.car, lst2.car) !== false) { + lst1 = lst1.cdr + lst2 = lst2.cdr + } else return false + } + } else return false + } + false_term_nboyer = '\u1E9C*' + true_term_nboyer = '\u1E9C*' + trans_of_implies1_nboyer = function (n) { + var sc_n_15 + return sc_isEqual(n, 1) + ? sc_list('\u1E9Cimplies', 0, 1) + : sc_list( + '\u1E9Cand', + sc_list('\u1E9Cimplies', n - 1, n), + ((sc_n_15 = n - 1), + sc_isEqual(sc_n_15, 1) + ? sc_list('\u1E9Cimplies', 0, 1) + : sc_list( + '\u1E9Cand', + sc_list('\u1E9Cimplies', sc_n_15 - 1, sc_n_15), + trans_of_implies1_nboyer(sc_n_15 - 1) + )) + ) + } + is_term_equal_nboyer = function (x, y) { + var lst1 + var lst2 + var r2 + var r1 + if (x instanceof sc_Pair) + if (y instanceof sc_Pair) + if (((r1 = x.car), (r2 = y.car), r1 === r2) !== false) { + lst1 = x.cdr + lst2 = y.cdr + while (true) { + if (lst1 === null) return lst2 === null + else if (lst2 === null) return false + else if (is_term_equal_nboyer(lst1.car, lst2.car) !== false) { + lst1 = lst1.cdr + lst2 = lst2.cdr + } else return false + } + } else return false + else return false + else return sc_isEqual(x, y) + } + is_term_member_nboyer = function (x, lst) { + var x + var lst + while (true) { + if (lst === null) return false + else if (is_term_equal_nboyer(x, lst.car) !== false) return true + else lst = lst.cdr + } + } + BgL_setupzd2boyerzd2 = function () { + var symbol_record + var value + var BgL_sc_symbolzd2record_16zd2 + var sym + var sc_sym_17 + var term + var lst + var sc_term_18 + var sc_term_19 + { + BgL_sc_za2symbolzd2recordszd2alistza2_2z00_nboyer = null + if_constructor_nboyer = + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer('\u1E9Cif') + false_term_nboyer = + ((sc_term_19 = new sc_Pair('\u1E9Cf', null)), + !(sc_term_19 instanceof sc_Pair) + ? sc_term_19 + : new sc_Pair( + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(sc_term_19.car), + translate_args_nboyer(sc_term_19.cdr) + )) + true_term_nboyer = + ((sc_term_18 = new sc_Pair('\u1E9Ct', null)), + !(sc_term_18 instanceof sc_Pair) + ? sc_term_18 + : new sc_Pair( + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(sc_term_18.car), + translate_args_nboyer(sc_term_18.cdr) + )) + lst = sc_const_3_nboyer + while (!(lst === null)) { + { + term = lst.car + if ( + term instanceof sc_Pair && + term.car === '\u1E9Cequal' && + term.cdr.car instanceof sc_Pair + ) { + sc_sym_17 = term.cdr.car.car + value = new sc_Pair( + !(term instanceof sc_Pair) + ? term + : new sc_Pair( + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(term.car), + translate_args_nboyer(term.cdr) + ), + ((sym = term.cdr.car.car), + (BgL_sc_symbolzd2record_16zd2 = + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(sym)), + BgL_sc_symbolzd2record_16zd2[1]) + ) + symbol_record = + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(sc_sym_17) + symbol_record[1] = value + } else sc_error('ADD-LEMMA did not like term: ', term) + lst = lst.cdr + } + } + return true + } + } + BgL_testzd2boyerzd2 = function (n) { + var optrOpnd + var term + var sc_n_20 + var answer + var sc_term_21 + var sc_term_22 + { + rewrite_count_nboyer = 0 + term = sc_const_4_nboyer + sc_n_20 = n + while (!(sc_n_20 === 0)) { + { + term = sc_list('\u1E9Cor', term, new sc_Pair('\u1E9Cf', null)) + --sc_n_20 + } + } + sc_term_22 = term + if (!(sc_term_22 instanceof sc_Pair)) optrOpnd = sc_term_22 + else + optrOpnd = new sc_Pair( + BgL_sc_symbolzd2ze3symbolzd2record_1ze3_nboyer(sc_term_22.car), + translate_args_nboyer(sc_term_22.cdr) + ) + sc_term_21 = apply_subst_nboyer( + const_nboyer === null + ? null + : new sc_Pair( + new sc_Pair( + const_nboyer.car.car, + translate_term_nboyer(const_nboyer.car.cdr) + ), + translate_alist_nboyer(const_nboyer.cdr) + ), + optrOpnd + ) + answer = tautologyp_nboyer(rewrite_nboyer(sc_term_21), null, null) + sc_write(rewrite_count_nboyer) + sc_display(' rewrites') + sc_newline() + if (answer !== false) return rewrite_count_nboyer + else return false + } + } +} +/* Exported Variables */ +var BgL_parsezd2ze3nbzd2treesze3 +var BgL_earleyzd2benchmarkzd2 +var BgL_parsezd2ze3parsedzf3zc2 +var test +var BgL_parsezd2ze3treesz31 +var BgL_makezd2parserzd2 +/* End Exports */ + +var const_earley +{ + const_earley = new sc_Pair( + new sc_Pair( + '\u1E9Cs', + new sc_Pair( + new sc_Pair('\u1E9Ca', null), + new sc_Pair(new sc_Pair('\u1E9Cs', new sc_Pair('\u1E9Cs', null)), null) + ) + ), + null + ) + BgL_makezd2parserzd2 = function (grammar, lexer) { + var i + var parser_descr + var def_loop + var nb_nts + var names + var steps + var predictors + var enders + var starters + var nts + var sc_names_1 + var sc_steps_2 + var sc_predictors_3 + var sc_enders_4 + var sc_starters_5 + var nb_confs + var BgL_sc_defzd2loop_6zd2 + var BgL_sc_nbzd2nts_7zd2 + var sc_nts_8 + var BgL_sc_defzd2loop_9zd2 + var ind + { + ind = function (nt, sc_nts_10) { + var i + { + i = sc_nts_10.length - 1 + while (true) { + if (i >= 0) + if (sc_isEqual(sc_nts_10[i], nt)) return i + else --i + else return false + } + } + } + sc_nts_8 = + ((BgL_sc_defzd2loop_9zd2 = function (defs, sc_nts_11) { + var rule_loop + var head + var def + return defs instanceof sc_Pair + ? ((def = defs.car), + (head = def.car), + (rule_loop = function (rules, sc_nts_12) { + var nt + var l + var sc_nts_13 + var rule + if (rules instanceof sc_Pair) { + rule = rules.car + l = rule + sc_nts_13 = sc_nts_12 + while (l instanceof sc_Pair) { + { + nt = l.car + l = l.cdr + sc_nts_13 = + sc_member(nt, sc_nts_13) !== false + ? sc_nts_13 + : new sc_Pair(nt, sc_nts_13) + } + } + return rule_loop(rules.cdr, sc_nts_13) + } else return BgL_sc_defzd2loop_9zd2(defs.cdr, sc_nts_12) + }), + rule_loop( + def.cdr, + sc_member(head, sc_nts_11) !== false + ? sc_nts_11 + : new sc_Pair(head, sc_nts_11) + )) + : sc_list2vector(sc_reverse(sc_nts_11)) + }), + BgL_sc_defzd2loop_9zd2(grammar, null)) + BgL_sc_nbzd2nts_7zd2 = sc_nts_8.length + nb_confs = + ((BgL_sc_defzd2loop_6zd2 = function (defs, BgL_sc_nbzd2confs_14zd2) { + var rule_loop + var def + return defs instanceof sc_Pair + ? ((def = defs.car), + (rule_loop = function (rules, BgL_sc_nbzd2confs_15zd2) { + var l + var BgL_sc_nbzd2confs_16zd2 + var rule + if (rules instanceof sc_Pair) { + rule = rules.car + l = rule + BgL_sc_nbzd2confs_16zd2 = BgL_sc_nbzd2confs_15zd2 + while (l instanceof sc_Pair) { + { + l = l.cdr + ++BgL_sc_nbzd2confs_16zd2 + } + } + return rule_loop(rules.cdr, BgL_sc_nbzd2confs_16zd2 + 1) + } else + return BgL_sc_defzd2loop_6zd2( + defs.cdr, + BgL_sc_nbzd2confs_15zd2 + ) + }), + rule_loop(def.cdr, BgL_sc_nbzd2confs_14zd2)) + : BgL_sc_nbzd2confs_14zd2 + }), + BgL_sc_defzd2loop_6zd2(grammar, 0)) + BgL_sc_nbzd2nts_7zd2 + sc_starters_5 = sc_makeVector(BgL_sc_nbzd2nts_7zd2, null) + sc_enders_4 = sc_makeVector(BgL_sc_nbzd2nts_7zd2, null) + sc_predictors_3 = sc_makeVector(BgL_sc_nbzd2nts_7zd2, null) + sc_steps_2 = sc_makeVector(nb_confs, false) + sc_names_1 = sc_makeVector(nb_confs, false) + nts = sc_nts_8 + starters = sc_starters_5 + enders = sc_enders_4 + predictors = sc_predictors_3 + steps = sc_steps_2 + names = sc_names_1 + nb_nts = sc_nts_8.length + i = nb_nts - 1 + while (i >= 0) { + { + sc_steps_2[i] = i - nb_nts + sc_names_1[i] = sc_list(sc_nts_8[i], 0) + sc_enders_4[i] = sc_list(i) + --i + } + } + def_loop = function (defs, conf) { + var rule_loop + var head + var def + return defs instanceof sc_Pair + ? ((def = defs.car), + (head = def.car), + (rule_loop = function (rules, conf, rule_num) { + var i + var sc_i_17 + var nt + var l + var sc_conf_18 + var sc_i_19 + var rule + if (rules instanceof sc_Pair) { + rule = rules.car + names[conf] = sc_list(head, rule_num) + sc_i_19 = ind(head, nts) + starters[sc_i_19] = new sc_Pair(conf, starters[sc_i_19]) + l = rule + sc_conf_18 = conf + while (l instanceof sc_Pair) { + { + nt = l.car + steps[sc_conf_18] = ind(nt, nts) + sc_i_17 = ind(nt, nts) + predictors[sc_i_17] = new sc_Pair( + sc_conf_18, + predictors[sc_i_17] + ) + l = l.cdr + ++sc_conf_18 + } + } + steps[sc_conf_18] = ind(head, nts) - nb_nts + i = ind(head, nts) + enders[i] = new sc_Pair(sc_conf_18, enders[i]) + return rule_loop(rules.cdr, sc_conf_18 + 1, rule_num + 1) + } else return def_loop(defs.cdr, conf) + }), + rule_loop(def.cdr, conf, 1)) + : undefined + } + def_loop(grammar, sc_nts_8.length) + parser_descr = [ + lexer, + sc_nts_8, + sc_starters_5, + sc_enders_4, + sc_predictors_3, + sc_steps_2, + sc_names_1, + ] + return function (input) { + var optrOpnd + var sc_optrOpnd_20 + var sc_optrOpnd_21 + var sc_optrOpnd_22 + var loop1 + var BgL_sc_stateza2_23za2 + var toks + var BgL_sc_nbzd2nts_24zd2 + var sc_steps_25 + var sc_enders_26 + var state_num + var BgL_sc_statesza2_27za2 + var states + var i + var conf + var l + var tok_nts + var sc_i_28 + var sc_i_29 + var l1 + var l2 + var tok + var tail1129 + var L1125 + var goal_enders + var BgL_sc_statesza2_30za2 + var BgL_sc_nbzd2nts_31zd2 + var BgL_sc_nbzd2confs_32zd2 + var nb_toks + var goal_starters + var sc_states_33 + var BgL_sc_nbzd2confs_34zd2 + var BgL_sc_nbzd2toks_35zd2 + var sc_toks_36 + var falseHead1128 + var sc_names_37 + var sc_steps_38 + var sc_predictors_39 + var sc_enders_40 + var sc_starters_41 + var sc_nts_42 + var lexer + var sc_ind_43 + var make_states + var BgL_sc_confzd2setzd2getza2_44za2 + var conf_set_merge_new_bang + var conf_set_adjoin + var BgL_sc_confzd2setzd2adjoinza2_45za2 + var BgL_sc_confzd2setzd2adjoinza2za2_46z00 + var conf_set_union + var forw + var is_parsed + var deriv_trees + var BgL_sc_derivzd2treesza2_47z70 + var nb_deriv_trees + var BgL_sc_nbzd2derivzd2treesza2_48za2 + { + sc_ind_43 = function (nt, sc_nts_49) { + var i + { + i = sc_nts_49.length - 1 + while (true) { + if (i >= 0) + if (sc_isEqual(sc_nts_49[i], nt)) return i + else --i + else return false + } + } + } + make_states = function ( + BgL_sc_nbzd2toks_50zd2, + BgL_sc_nbzd2confs_51zd2 + ) { + var v + var i + var sc_states_52 + { + sc_states_52 = sc_makeVector(BgL_sc_nbzd2toks_50zd2 + 1, false) + i = BgL_sc_nbzd2toks_50zd2 + while (i >= 0) { + { + v = sc_makeVector(BgL_sc_nbzd2confs_51zd2 + 1, false) + v[0] = -1 + sc_states_52[i] = v + --i + } + } + return sc_states_52 + } + } + BgL_sc_confzd2setzd2getza2_44za2 = function ( + state, + BgL_sc_statezd2num_53zd2, + sc_conf_54 + ) { + var conf_set + var BgL_sc_confzd2set_55zd2 + return ( + (BgL_sc_confzd2set_55zd2 = state[sc_conf_54 + 1]), + BgL_sc_confzd2set_55zd2 !== false + ? BgL_sc_confzd2set_55zd2 + : ((conf_set = sc_makeVector( + BgL_sc_statezd2num_53zd2 + 6, + false + )), + (conf_set[1] = -3), + (conf_set[2] = -1), + (conf_set[3] = -1), + (conf_set[4] = -1), + (state[sc_conf_54 + 1] = conf_set), + conf_set) + ) + } + conf_set_merge_new_bang = function (conf_set) { + return ( + (conf_set[conf_set[1] + 5] = conf_set[4]), + (conf_set[1] = conf_set[3]), + (conf_set[3] = -1), + (conf_set[4] = -1) + ) + } + conf_set_adjoin = function (state, conf_set, sc_conf_56, i) { + var tail + return ( + (tail = conf_set[3]), + (conf_set[i + 5] = -1), + (conf_set[tail + 5] = i), + (conf_set[3] = i), + tail < 0 + ? ((conf_set[0] = state[0]), (state[0] = sc_conf_56)) + : undefined + ) + } + BgL_sc_confzd2setzd2adjoinza2_45za2 = function ( + sc_states_57, + BgL_sc_statezd2num_58zd2, + l, + i + ) { + var conf_set + var sc_conf_59 + var l1 + var state + { + state = sc_states_57[BgL_sc_statezd2num_58zd2] + l1 = l + while (l1 instanceof sc_Pair) { + { + sc_conf_59 = l1.car + conf_set = BgL_sc_confzd2setzd2getza2_44za2( + state, + BgL_sc_statezd2num_58zd2, + sc_conf_59 + ) + if (conf_set[i + 5] === false) { + conf_set_adjoin(state, conf_set, sc_conf_59, i) + l1 = l1.cdr + } else l1 = l1.cdr + } + } + return undefined + } + } + BgL_sc_confzd2setzd2adjoinza2za2_46z00 = function ( + sc_states_60, + BgL_sc_statesza2_61za2, + BgL_sc_statezd2num_62zd2, + sc_conf_63, + i + ) { + var BgL_sc_confzd2setza2_64z70 + var BgL_sc_stateza2_65za2 + var conf_set + var state + return ( + (state = sc_states_60[BgL_sc_statezd2num_62zd2]), + ((conf_set = state[sc_conf_63 + 1]), + conf_set !== false ? conf_set[i + 5] : false) !== false + ? ((BgL_sc_stateza2_65za2 = + BgL_sc_statesza2_61za2[BgL_sc_statezd2num_62zd2]), + (BgL_sc_confzd2setza2_64z70 = + BgL_sc_confzd2setzd2getza2_44za2( + BgL_sc_stateza2_65za2, + BgL_sc_statezd2num_62zd2, + sc_conf_63 + )), + BgL_sc_confzd2setza2_64z70[i + 5] === false + ? conf_set_adjoin( + BgL_sc_stateza2_65za2, + BgL_sc_confzd2setza2_64z70, + sc_conf_63, + i + ) + : undefined, + true) + : false + ) + } + conf_set_union = function (state, conf_set, sc_conf_66, other_set) { + var i + { + i = other_set[2] + while (i >= 0) { + if (conf_set[i + 5] === false) { + conf_set_adjoin(state, conf_set, sc_conf_66, i) + i = other_set[i + 5] + } else i = other_set[i + 5] + } + return undefined + } + } + forw = function ( + sc_states_67, + BgL_sc_statezd2num_68zd2, + sc_starters_69, + sc_enders_70, + sc_predictors_71, + sc_steps_72, + sc_nts_73 + ) { + var next_set + var next + var conf_set + var ender + var l + var starter_set + var starter + var sc_l_74 + var sc_loop1_75 + var head + var BgL_sc_confzd2set_76zd2 + var BgL_sc_statezd2num_77zd2 + var state + var sc_states_78 + var preds + var BgL_sc_confzd2set_79zd2 + var step + var sc_conf_80 + var BgL_sc_nbzd2nts_81zd2 + var sc_state_82 + { + sc_state_82 = sc_states_67[BgL_sc_statezd2num_68zd2] + BgL_sc_nbzd2nts_81zd2 = sc_nts_73.length + while (true) { + { + sc_conf_80 = sc_state_82[0] + if (sc_conf_80 >= 0) { + step = sc_steps_72[sc_conf_80] + BgL_sc_confzd2set_79zd2 = sc_state_82[sc_conf_80 + 1] + head = BgL_sc_confzd2set_79zd2[4] + sc_state_82[0] = BgL_sc_confzd2set_79zd2[0] + conf_set_merge_new_bang(BgL_sc_confzd2set_79zd2) + if (step >= 0) { + sc_l_74 = sc_starters_69[step] + while (sc_l_74 instanceof sc_Pair) { + { + starter = sc_l_74.car + starter_set = BgL_sc_confzd2setzd2getza2_44za2( + sc_state_82, + BgL_sc_statezd2num_68zd2, + starter + ) + if ( + starter_set[BgL_sc_statezd2num_68zd2 + 5] === false + ) { + conf_set_adjoin( + sc_state_82, + starter_set, + starter, + BgL_sc_statezd2num_68zd2 + ) + sc_l_74 = sc_l_74.cdr + } else sc_l_74 = sc_l_74.cdr + } + } + l = sc_enders_70[step] + while (l instanceof sc_Pair) { + { + ender = l.car + if ( + ((conf_set = sc_state_82[ender + 1]), + conf_set !== false + ? conf_set[BgL_sc_statezd2num_68zd2 + 5] + : false) !== false + ) { + next = sc_conf_80 + 1 + next_set = BgL_sc_confzd2setzd2getza2_44za2( + sc_state_82, + BgL_sc_statezd2num_68zd2, + next + ) + conf_set_union( + sc_state_82, + next_set, + next, + BgL_sc_confzd2set_79zd2 + ) + l = l.cdr + } else l = l.cdr + } + } + } else { + preds = sc_predictors_71[step + BgL_sc_nbzd2nts_81zd2] + sc_states_78 = sc_states_67 + state = sc_state_82 + BgL_sc_statezd2num_77zd2 = BgL_sc_statezd2num_68zd2 + BgL_sc_confzd2set_76zd2 = BgL_sc_confzd2set_79zd2 + sc_loop1_75 = function (l) { + var sc_state_83 + var BgL_sc_nextzd2set_84zd2 + var sc_next_85 + var pred_set + var i + var pred + if (l instanceof sc_Pair) { + pred = l.car + i = head + while (i >= 0) { + { + pred_set = + ((sc_state_83 = sc_states_78[i]), + sc_state_83[pred + 1]) + if (pred_set !== false) { + sc_next_85 = pred + 1 + BgL_sc_nextzd2set_84zd2 = + BgL_sc_confzd2setzd2getza2_44za2( + state, + BgL_sc_statezd2num_77zd2, + sc_next_85 + ) + conf_set_union( + state, + BgL_sc_nextzd2set_84zd2, + sc_next_85, + pred_set + ) + } + i = BgL_sc_confzd2set_76zd2[i + 5] + } + } + return sc_loop1_75(l.cdr) + } else return undefined + } + sc_loop1_75(preds) + } + } else return undefined + } + } + } + } + is_parsed = function ( + nt, + i, + j, + sc_nts_86, + sc_enders_87, + sc_states_88 + ) { + var conf_set + var state + var sc_conf_89 + var l + var BgL_sc_ntza2_90za2 + { + BgL_sc_ntza2_90za2 = sc_ind_43(nt, sc_nts_86) + if (BgL_sc_ntza2_90za2 !== false) { + sc_nts_86.length + l = sc_enders_87[BgL_sc_ntza2_90za2] + while (true) { + if (l instanceof sc_Pair) { + sc_conf_89 = l.car + if ( + ((state = sc_states_88[j]), + (conf_set = state[sc_conf_89 + 1]), + conf_set !== false ? conf_set[i + 5] : false) !== false + ) + return true + else l = l.cdr + } else return false + } + } else return false + } + } + deriv_trees = function ( + sc_conf_91, + i, + j, + sc_enders_92, + sc_steps_93, + sc_names_94, + sc_toks_95, + sc_states_96, + BgL_sc_nbzd2nts_97zd2 + ) { + var sc_loop1_98 + var prev + var name + return ( + (name = sc_names_94[sc_conf_91]), + name !== false + ? sc_conf_91 < BgL_sc_nbzd2nts_97zd2 + ? sc_list(sc_list(name, sc_toks_95[i].car)) + : sc_list(sc_list(name)) + : ((prev = sc_conf_91 - 1), + (sc_loop1_98 = function (l1, l2) { + var loop2 + var ender_set + var state + var ender + var l1 + var l2 + while (true) { + if (l1 instanceof sc_Pair) { + ender = l1.car + ender_set = + ((state = sc_states_96[j]), state[ender + 1]) + if (ender_set !== false) { + loop2 = function (k, l2) { + var loop3 + var ender_trees + var prev_trees + var conf_set + var sc_state_99 + var k + var l2 + while (true) { + if (k >= 0) + if ( + k >= i && + ((sc_state_99 = sc_states_96[k]), + (conf_set = sc_state_99[prev + 1]), + conf_set !== false + ? conf_set[i + 5] + : false) !== false + ) { + prev_trees = deriv_trees( + prev, + i, + k, + sc_enders_92, + sc_steps_93, + sc_names_94, + sc_toks_95, + sc_states_96, + BgL_sc_nbzd2nts_97zd2 + ) + ender_trees = deriv_trees( + ender, + k, + j, + sc_enders_92, + sc_steps_93, + sc_names_94, + sc_toks_95, + sc_states_96, + BgL_sc_nbzd2nts_97zd2 + ) + loop3 = function (l3, l2) { + var l4 + var sc_l2_100 + var ender_tree + if (l3 instanceof sc_Pair) { + ender_tree = sc_list(l3.car) + l4 = prev_trees + sc_l2_100 = l2 + while (l4 instanceof sc_Pair) { + { + sc_l2_100 = new sc_Pair( + sc_append(l4.car, ender_tree), + sc_l2_100 + ) + l4 = l4.cdr + } + } + return loop3(l3.cdr, sc_l2_100) + } else return loop2(ender_set[k + 5], l2) + } + return loop3(ender_trees, l2) + } else k = ender_set[k + 5] + else return sc_loop1_98(l1.cdr, l2) + } + } + return loop2(ender_set[2], l2) + } else l1 = l1.cdr + } else return l2 + } + }), + sc_loop1_98(sc_enders_92[sc_steps_93[prev]], null)) + ) + } + BgL_sc_derivzd2treesza2_47z70 = function ( + nt, + i, + j, + sc_nts_101, + sc_enders_102, + sc_steps_103, + sc_names_104, + sc_toks_105, + sc_states_106 + ) { + var conf_set + var state + var sc_conf_107 + var l + var trees + var BgL_sc_nbzd2nts_108zd2 + var BgL_sc_ntza2_109za2 + { + BgL_sc_ntza2_109za2 = sc_ind_43(nt, sc_nts_101) + if (BgL_sc_ntza2_109za2 !== false) { + BgL_sc_nbzd2nts_108zd2 = sc_nts_101.length + l = sc_enders_102[BgL_sc_ntza2_109za2] + trees = null + while (l instanceof sc_Pair) { + { + sc_conf_107 = l.car + if ( + ((state = sc_states_106[j]), + (conf_set = state[sc_conf_107 + 1]), + conf_set !== false ? conf_set[i + 5] : false) !== false + ) { + l = l.cdr + trees = sc_append( + deriv_trees( + sc_conf_107, + i, + j, + sc_enders_102, + sc_steps_103, + sc_names_104, + sc_toks_105, + sc_states_106, + BgL_sc_nbzd2nts_108zd2 + ), + trees + ) + } else l = l.cdr + } + } + return trees + } else return false + } + } + nb_deriv_trees = function ( + sc_conf_110, + i, + j, + sc_enders_111, + sc_steps_112, + sc_toks_113, + sc_states_114, + BgL_sc_nbzd2nts_115zd2 + ) { + var sc_loop1_116 + var tmp1124 + var prev + return ( + (prev = sc_conf_110 - 1), + ((tmp1124 = sc_conf_110 < BgL_sc_nbzd2nts_115zd2), + tmp1124 !== false ? tmp1124 : sc_steps_112[prev] < 0) !== false + ? 1 + : ((sc_loop1_116 = function (l, sc_n_118) { + var nb_ender_trees + var nb_prev_trees + var conf_set + var state + var k + var n + var ender_set + var sc_state_117 + var ender + var l + var sc_n_118 + while (true) { + if (l instanceof sc_Pair) { + ender = l.car + ender_set = + ((sc_state_117 = sc_states_114[j]), + sc_state_117[ender + 1]) + if (ender_set !== false) { + k = ender_set[2] + n = sc_n_118 + while (k >= 0) { + if ( + k >= i && + ((state = sc_states_114[k]), + (conf_set = state[prev + 1]), + conf_set !== false ? conf_set[i + 5] : false) !== + false + ) { + nb_prev_trees = nb_deriv_trees( + prev, + i, + k, + sc_enders_111, + sc_steps_112, + sc_toks_113, + sc_states_114, + BgL_sc_nbzd2nts_115zd2 + ) + nb_ender_trees = nb_deriv_trees( + ender, + k, + j, + sc_enders_111, + sc_steps_112, + sc_toks_113, + sc_states_114, + BgL_sc_nbzd2nts_115zd2 + ) + k = ender_set[k + 5] + n += nb_prev_trees * nb_ender_trees + } else k = ender_set[k + 5] + } + return sc_loop1_116(l.cdr, n) + } else l = l.cdr + } else return sc_n_118 + } + }), + sc_loop1_116(sc_enders_111[sc_steps_112[prev]], 0)) + ) + } + BgL_sc_nbzd2derivzd2treesza2_48za2 = function ( + nt, + i, + j, + sc_nts_119, + sc_enders_120, + sc_steps_121, + sc_toks_122, + sc_states_123 + ) { + var conf_set + var state + var sc_conf_124 + var l + var nb_trees + var BgL_sc_nbzd2nts_125zd2 + var BgL_sc_ntza2_126za2 + { + BgL_sc_ntza2_126za2 = sc_ind_43(nt, sc_nts_119) + if (BgL_sc_ntza2_126za2 !== false) { + BgL_sc_nbzd2nts_125zd2 = sc_nts_119.length + l = sc_enders_120[BgL_sc_ntza2_126za2] + nb_trees = 0 + while (l instanceof sc_Pair) { + { + sc_conf_124 = l.car + if ( + ((state = sc_states_123[j]), + (conf_set = state[sc_conf_124 + 1]), + conf_set !== false ? conf_set[i + 5] : false) !== false + ) { + l = l.cdr + nb_trees = + nb_deriv_trees( + sc_conf_124, + i, + j, + sc_enders_120, + sc_steps_121, + sc_toks_122, + sc_states_123, + BgL_sc_nbzd2nts_125zd2 + ) + nb_trees + } else l = l.cdr + } + } + return nb_trees + } else return false + } + } + lexer = parser_descr[0] + sc_nts_42 = parser_descr[1] + sc_starters_41 = parser_descr[2] + sc_enders_40 = parser_descr[3] + sc_predictors_39 = parser_descr[4] + sc_steps_38 = parser_descr[5] + sc_names_37 = parser_descr[6] + falseHead1128 = new sc_Pair(null, null) + L1125 = lexer(input) + tail1129 = falseHead1128 + while (!(L1125 === null)) { + { + tok = L1125.car + l1 = tok.cdr + l2 = null + while (l1 instanceof sc_Pair) { + { + sc_i_29 = sc_ind_43(l1.car, sc_nts_42) + if (sc_i_29 !== false) { + l1 = l1.cdr + l2 = new sc_Pair(sc_i_29, l2) + } else l1 = l1.cdr + } + } + sc_optrOpnd_22 = new sc_Pair(tok.car, sc_reverse(l2)) + sc_optrOpnd_21 = new sc_Pair(sc_optrOpnd_22, null) + tail1129.cdr = sc_optrOpnd_21 + tail1129 = tail1129.cdr + L1125 = L1125.cdr + } + } + sc_optrOpnd_20 = falseHead1128.cdr + sc_toks_36 = sc_list2vector(sc_optrOpnd_20) + BgL_sc_nbzd2toks_35zd2 = sc_toks_36.length + BgL_sc_nbzd2confs_34zd2 = sc_steps_38.length + sc_states_33 = make_states( + BgL_sc_nbzd2toks_35zd2, + BgL_sc_nbzd2confs_34zd2 + ) + goal_starters = sc_starters_41[0] + BgL_sc_confzd2setzd2adjoinza2_45za2(sc_states_33, 0, goal_starters, 0) + forw( + sc_states_33, + 0, + sc_starters_41, + sc_enders_40, + sc_predictors_39, + sc_steps_38, + sc_nts_42 + ) + sc_i_28 = 0 + while (sc_i_28 < BgL_sc_nbzd2toks_35zd2) { + { + tok_nts = sc_toks_36[sc_i_28].cdr + BgL_sc_confzd2setzd2adjoinza2_45za2( + sc_states_33, + sc_i_28 + 1, + tok_nts, + sc_i_28 + ) + forw( + sc_states_33, + sc_i_28 + 1, + sc_starters_41, + sc_enders_40, + sc_predictors_39, + sc_steps_38, + sc_nts_42 + ) + ++sc_i_28 + } + } + nb_toks = sc_toks_36.length + BgL_sc_nbzd2confs_32zd2 = sc_steps_38.length + BgL_sc_nbzd2nts_31zd2 = sc_nts_42.length + BgL_sc_statesza2_30za2 = make_states(nb_toks, BgL_sc_nbzd2confs_32zd2) + goal_enders = sc_enders_40[0] + l = goal_enders + while (l instanceof sc_Pair) { + { + conf = l.car + BgL_sc_confzd2setzd2adjoinza2za2_46z00( + sc_states_33, + BgL_sc_statesza2_30za2, + nb_toks, + conf, + 0 + ) + l = l.cdr + } + } + i = nb_toks + while (i >= 0) { + { + states = sc_states_33 + BgL_sc_statesza2_27za2 = BgL_sc_statesza2_30za2 + state_num = i + sc_enders_26 = sc_enders_40 + sc_steps_25 = sc_steps_38 + BgL_sc_nbzd2nts_24zd2 = BgL_sc_nbzd2nts_31zd2 + toks = sc_toks_36 + BgL_sc_stateza2_23za2 = BgL_sc_statesza2_30za2[i] + loop1 = function () { + var sc_loop1_127 + var prev + var BgL_sc_statesza2_128za2 + var sc_states_129 + var j + var i + var sc_i_130 + var head + var conf_set + var sc_conf_131 + { + sc_conf_131 = BgL_sc_stateza2_23za2[0] + if (sc_conf_131 >= 0) { + conf_set = BgL_sc_stateza2_23za2[sc_conf_131 + 1] + head = conf_set[4] + BgL_sc_stateza2_23za2[0] = conf_set[0] + conf_set_merge_new_bang(conf_set) + sc_i_130 = head + while (sc_i_130 >= 0) { + { + i = sc_i_130 + j = state_num + sc_states_129 = states + BgL_sc_statesza2_128za2 = BgL_sc_statesza2_27za2 + prev = sc_conf_131 - 1 + if ( + sc_conf_131 >= BgL_sc_nbzd2nts_24zd2 && + sc_steps_25[prev] >= 0 + ) { + sc_loop1_127 = function (l) { + var k + var ender_set + var state + var ender + var l + while (true) { + if (l instanceof sc_Pair) { + ender = l.car + ender_set = + ((state = sc_states_129[j]), state[ender + 1]) + if (ender_set !== false) { + k = ender_set[2] + while (k >= 0) { + { + if (k >= i) + if ( + BgL_sc_confzd2setzd2adjoinza2za2_46z00( + sc_states_129, + BgL_sc_statesza2_128za2, + k, + prev, + i + ) !== false + ) + BgL_sc_confzd2setzd2adjoinza2za2_46z00( + sc_states_129, + BgL_sc_statesza2_128za2, + j, + ender, + k + ) + k = ender_set[k + 5] + } + } + return sc_loop1_127(l.cdr) + } else l = l.cdr + } else return undefined + } + } + sc_loop1_127(sc_enders_26[sc_steps_25[prev]]) + } + sc_i_130 = conf_set[sc_i_130 + 5] + } + } + return loop1() + } else return undefined + } + } + loop1() + --i + } + } + optrOpnd = BgL_sc_statesza2_30za2 + return [ + sc_nts_42, + sc_starters_41, + sc_enders_40, + sc_predictors_39, + sc_steps_38, + sc_names_37, + sc_toks_36, + optrOpnd, + is_parsed, + BgL_sc_derivzd2treesza2_47z70, + BgL_sc_nbzd2derivzd2treesza2_48za2, + ] + } + } + } + } + BgL_parsezd2ze3parsedzf3zc2 = function (parse, nt, i, j) { + var is_parsed + var states + var enders + var nts + return ( + (nts = parse[0]), + (enders = parse[2]), + (states = parse[7]), + (is_parsed = parse[8]), + is_parsed(nt, i, j, nts, enders, states) + ) + } + BgL_parsezd2ze3treesz31 = function (parse, nt, i, j) { + var BgL_sc_derivzd2treesza2_132z70 + var states + var toks + var names + var steps + var enders + var nts + return ( + (nts = parse[0]), + (enders = parse[2]), + (steps = parse[4]), + (names = parse[5]), + (toks = parse[6]), + (states = parse[7]), + (BgL_sc_derivzd2treesza2_132z70 = parse[9]), + BgL_sc_derivzd2treesza2_132z70( + nt, + i, + j, + nts, + enders, + steps, + names, + toks, + states + ) + ) + } + BgL_parsezd2ze3nbzd2treesze3 = function (parse, nt, i, j) { + var BgL_sc_nbzd2derivzd2treesza2_133za2 + var states + var toks + var steps + var enders + var nts + return ( + (nts = parse[0]), + (enders = parse[2]), + (steps = parse[4]), + (toks = parse[6]), + (states = parse[7]), + (BgL_sc_nbzd2derivzd2treesza2_133za2 = parse[10]), + BgL_sc_nbzd2derivzd2treesza2_133za2( + nt, + i, + j, + nts, + enders, + steps, + toks, + states + ) + ) + } + test = function (k) { + var x + var p + return ( + (p = BgL_makezd2parserzd2(const_earley, function (l) { + var sc_x_134 + var tail1134 + var L1130 + var falseHead1133 + { + falseHead1133 = new sc_Pair(null, null) + tail1134 = falseHead1133 + L1130 = l + while (!(L1130 === null)) { + { + tail1134.cdr = new sc_Pair( + ((sc_x_134 = L1130.car), sc_list(sc_x_134, sc_x_134)), + null + ) + tail1134 = tail1134.cdr + L1130 = L1130.cdr + } + } + return falseHead1133.cdr + } + })), + (x = p(sc_vector2list(sc_makeVector(k, '\u1E9Ca')))), + sc_length(BgL_parsezd2ze3treesz31(x, '\u1E9Cs', 0, k)) + ) + } + BgL_earleyzd2benchmarkzd2 = function () { + var args = null + for (var sc_tmp = arguments.length - 1; sc_tmp >= 0; sc_tmp--) { + args = sc_cons(arguments[sc_tmp], args) + } + var k + return ( + (k = args === null ? 7 : args.car), + BgL_runzd2benchmarkzd2( + 'earley', + 1, + function () { + return test(k) + }, + function (result) { + return sc_display(result), sc_newline(), result == 132 + } + ) + ) + } +} + +/************* END OF GENERATED CODE *************/ +// Invoke this function to run a benchmark. +// The first argument is a string identifying the benchmark. +// The second argument is the number of times to run the benchmark. +// The third argument is a function that runs the benchmark. +// The fourth argument is a unary function that warns if the result +// returned by the benchmark is incorrect. +// +// Example: +// RunBenchmark("new Array()", +// 1, +// function () { new Array(1000000); } +// function (v) { +// return (v instanceof Array) && (v.length == 1000000); +// }); + +SC_DEFAULT_OUT = new sc_GenericOutputPort(function (s) {}) +SC_ERROR_OUT = SC_DEFAULT_OUT + +function RunBenchmark(name, count, run, warn) { + for (var n = 0; n < count; ++n) { + var result = run() + if (!warn(result)) { + throw new Error('Earley or Boyer did incorrect number of rewrites') + } + } +} + +var BgL_runzd2benchmarkzd2 = RunBenchmark + +var EarleyBoyer = new BenchmarkSuite('EarleyBoyer', 666463, [ + new Benchmark('Earley', function () { + BgL_earleyzd2benchmarkzd2() + }), + new Benchmark('Boyer', function () { + BgL_nboyerzd2benchmarkzd2() + }), +]) + +// Copyright 2010 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Automatically generated on 2009-01-30. Manually updated on 2010-09-17. + +// This benchmark is generated by loading 50 of the most popular pages +// on the web and logging all regexp operations performed. Each +// operation is given a weight that is calculated from an estimate of +// the popularity of the pages where it occurs and the number of times +// it is executed while loading each page. Furthermore the literal +// letters in the data are encoded using ROT13 in a way that does not +// affect how the regexps match their input. Finally the strings are +// scrambled to exercise the regexp engine on different input strings. + +var RegExp = new BenchmarkSuite('RegExp', 910985, [ + new Benchmark('RegExp', RegExpRun, RegExpSetup, RegExpTearDown), +]) + +var regExpBenchmark = null + +function RegExpSetup() { + regExpBenchmark = new RegExpBenchmark() + RegExpRun() // run once to get system initialized +} + +function RegExpRun() { + regExpBenchmark.run() +} + +function RegExpTearDown() { + regExpBenchmark = null +} + +// Returns an array of n different variants of the input string str. +// The variants are computed by randomly rotating one random +// character. +function computeInputVariants(str, n) { + var variants = [str] + for (var i = 1; i < n; i++) { + var pos = Math.floor(Math.random() * str.length) + var chr = String.fromCharCode( + (str.charCodeAt(pos) + Math.floor(Math.random() * 128)) % 128 + ) + variants[i] = + str.substring(0, pos) + chr + str.substring(pos + 1, str.length) + } + return variants +} + +function RegExpBenchmark() { + var re0 = /^ba/ + var re1 = /(((\w+):\/\/)([^\/:]*)(:(\d+))?)?([^#?]*)(\?([^#]*))?(#(.*))?/ + var re2 = /^\s*|\s*$/g + var re3 = /\bQBZPbageby_cynprubyqre\b/ + var re4 = /,/ + var re5 = /\bQBZPbageby_cynprubyqre\b/g + var re6 = /^[\s\xa0]+|[\s\xa0]+$/g + var re7 = /(\d*)(\D*)/g + var re8 = /=/ + var re9 = /(^|\s)lhv\-h(\s|$)/ + var str0 = + 'Zbmvyyn/5.0 (Jvaqbjf; H; Jvaqbjf AG 5.1; ra-HF) NccyrJroXvg/528.9 (XUGZY, yvxr Trpxb) Puebzr/2.0.157.0 Fnsnev/528.9' + var re10 = /\#/g + var re11 = /\./g + var re12 = /'/g + var re13 = /\?[\w\W]*(sevraqvq|punaaryvq|tebhcvq)=([^\&\?#]*)/i + var str1 = 'Fubpxjnir Synfu 9.0 e115' + var re14 = /\s+/g + var re15 = /^\s*(\S*(\s+\S+)*)\s*$/ + var re16 = /(-[a-z])/i + + var s0 = computeInputVariants('pyvpx', 6511) + var s1 = computeInputVariants('uggc://jjj.snprobbx.pbz/ybtva.cuc', 1844) + var s2 = computeInputVariants('QBZPbageby_cynprubyqre', 739) + var s3 = computeInputVariants('uggc://jjj.snprobbx.pbz/', 598) + var s4 = computeInputVariants('uggc://jjj.snprobbx.pbz/fepu.cuc', 454) + var s5 = computeInputVariants('qqqq, ZZZ q, llll', 352) + var s6 = computeInputVariants('vachggrkg QBZPbageby_cynprubyqre', 312) + var s7 = computeInputVariants('/ZlFcnprUbzrcntr/Vaqrk-FvgrUbzr,10000000', 282) + var s8 = computeInputVariants('vachggrkg', 177) + var s9 = computeInputVariants('528.9', 170) + var s10 = computeInputVariants('528', 170) + var s11 = computeInputVariants('VCPhygher=ra-HF', 156) + var s12 = computeInputVariants('CersreerqPhygher=ra-HF', 156) + var s13 = computeInputVariants('xrlcerff', 144) + var s14 = computeInputVariants('521', 139) + var s15 = computeInputVariants(str0, 139) + var s16 = computeInputVariants('qvi .so_zrah', 137) + var s17 = computeInputVariants('qvi.so_zrah', 137) + var s18 = computeInputVariants('uvqqra_ryrz', 117) + var s19 = computeInputVariants( + 'sevraqfgre_naba=nvq%3Qn6ss9p85n868ro9s059pn854735956o3%26ers%3Q%26df%3Q%26vpgl%3QHF', + 95 + ) + var s20 = computeInputVariants('uggc://ubzr.zlfcnpr.pbz/vaqrk.psz', 93) + var s21 = computeInputVariants(str1, 92) + var s22 = computeInputVariants('svefg', 85) + var s23 = computeInputVariants('uggc://cebsvyr.zlfcnpr.pbz/vaqrk.psz', 85) + var s24 = computeInputVariants('ynfg', 85) + var s25 = computeInputVariants('qvfcynl', 85) + + function runBlock0() { + for (var i = 0; i < 6511; i++) { + re0.exec(s0[i]) + } + for (var i = 0; i < 1844; i++) { + re1.exec(s1[i]) + } + for (var i = 0; i < 739; i++) { + s2[i].replace(re2, '') + } + for (var i = 0; i < 598; i++) { + re1.exec(s3[i]) + } + for (var i = 0; i < 454; i++) { + re1.exec(s4[i]) + } + for (var i = 0; i < 352; i++) { + ;/qqqq|qqq|qq|q|ZZZZ|ZZZ|ZZ|Z|llll|ll|l|uu|u|UU|U|zz|z|ff|f|gg|g|sss|ss|s|mmm|mm|m/g.exec( + s5[i] + ) + } + for (var i = 0; i < 312; i++) { + re3.exec(s6[i]) + } + for (var i = 0; i < 282; i++) { + re4.exec(s7[i]) + } + for (var i = 0; i < 177; i++) { + s8[i].replace(re5, '') + } + for (var i = 0; i < 170; i++) { + s9[i].replace(re6, '') + re7.exec(s10[i]) + } + for (var i = 0; i < 156; i++) { + re8.exec(s11[i]) + re8.exec(s12[i]) + } + for (var i = 0; i < 144; i++) { + re0.exec(s13[i]) + } + for (var i = 0; i < 139; i++) { + s14[i].replace(re6, '') + re7.exec(s14[i]) + re9.exec('') + ;/JroXvg\/(\S+)/.exec(s15[i]) + } + for (var i = 0; i < 137; i++) { + s16[i].replace(re10, '') + s16[i].replace(/\[/g, '') + s17[i].replace(re11, '') + } + for (var i = 0; i < 117; i++) { + s18[i].replace(re2, '') + } + for (var i = 0; i < 95; i++) { + ;/(?:^|;)\s*sevraqfgre_ynat=([^;]*)/.exec(s19[i]) + } + for (var i = 0; i < 93; i++) { + s20[i].replace(re12, '') + re13.exec(s20[i]) + } + for (var i = 0; i < 92; i++) { + s21[i].replace(/([a-zA-Z]|\s)+/, '') + } + for (var i = 0; i < 85; i++) { + s22[i].replace(re14, '') + s22[i].replace(re15, '') + s23[i].replace(re12, '') + s24[i].replace(re14, '') + s24[i].replace(re15, '') + re16.exec(s25[i]) + re13.exec(s23[i]) + } + } + var re17 = /(^|[^\\])\"\\\/Qngr\((-?[0-9]+)\)\\\/\"/g + var str2 = + '{"anzr":"","ahzoreSbezng":{"PheeraplQrpvznyQvtvgf":2,"PheeraplQrpvznyFrcnengbe":".","VfErnqBayl":gehr,"PheeraplTebhcFvmrf":[3],"AhzoreTebhcFvmrf":[3],"CrepragTebhcFvmrf":[3],"PheeraplTebhcFrcnengbe":",","PheeraplFlzoby":"\xa4","AnAFlzoby":"AnA","PheeraplArtngvirCnggrea":0,"AhzoreArtngvirCnggrea":1,"CrepragCbfvgvirCnggrea":0,"CrepragArtngvirCnggrea":0,"ArtngvirVasvavglFlzoby":"-Vasvavgl","ArtngvirFvta":"-","AhzoreQrpvznyQvtvgf":2,"AhzoreQrpvznyFrcnengbe":".","AhzoreTebhcFrcnengbe":",","PheeraplCbfvgvirCnggrea":0,"CbfvgvirVasvavglFlzoby":"Vasvavgl","CbfvgvirFvta":"+","CrepragQrpvznyQvtvgf":2,"CrepragQrpvznyFrcnengbe":".","CrepragTebhcFrcnengbe":",","CrepragFlzoby":"%","CreZvyyrFlzoby":"\u2030","AngvirQvtvgf":["0","1","2","3","4","5","6","7","8","9"],"QvtvgFhofgvghgvba":1},"qngrGvzrSbezng":{"NZQrfvtangbe":"NZ","Pnyraqne":{"ZvaFhccbegrqQngrGvzr":"@-62135568000000@","ZnkFhccbegrqQngrGvzr":"@253402300799999@","NytbevguzGlcr":1,"PnyraqneGlcr":1,"Renf":[1],"GjbQvtvgLrneZnk":2029,"VfErnqBayl":gehr},"QngrFrcnengbe":"/","SvefgQnlBsJrrx":0,"PnyraqneJrrxEhyr":0,"ShyyQngrGvzrCnggrea":"qqqq, qq ZZZZ llll UU:zz:ff","YbatQngrCnggrea":"qqqq, qq ZZZZ llll","YbatGvzrCnggrea":"UU:zz:ff","ZbaguQnlCnggrea":"ZZZZ qq","CZQrfvtangbe":"CZ","ESP1123Cnggrea":"qqq, qq ZZZ llll UU\':\'zz\':\'ff \'TZG\'","FubegQngrCnggrea":"ZZ/qq/llll","FubegGvzrCnggrea":"UU:zz","FbegnoyrQngrGvzrCnggrea":"llll\'-\'ZZ\'-\'qq\'G\'UU\':\'zz\':\'ff","GvzrFrcnengbe":":","HavirefnyFbegnoyrQngrGvzrCnggrea":"llll\'-\'ZZ\'-\'qq UU\':\'zz\':\'ff\'M\'","LrneZbaguCnggrea":"llll ZZZZ","NooerivngrqQnlAnzrf":["Fha","Zba","Ghr","Jrq","Guh","Sev","Fng"],"FubegrfgQnlAnzrf":["Fh","Zb","Gh","Jr","Gu","Se","Fn"],"QnlAnzrf":["Fhaqnl","Zbaqnl","Ghrfqnl","Jrqarfqnl","Guhefqnl","Sevqnl","Fngheqnl"],"NooerivngrqZbaguAnzrf":["Wna","Sro","Zne","Nce","Znl","Wha","Why","Nht","Frc","Bpg","Abi","Qrp",""],"ZbaguAnzrf":["Wnahnel","Sroehnel","Znepu","Ncevy","Znl","Whar","Whyl","Nhthfg","Frcgrzore","Bpgbore","Abirzore","Qrprzore",""],"VfErnqBayl":gehr,"AngvirPnyraqneAnzr":"Tertbevna Pnyraqne","NooerivngrqZbaguTravgvirAnzrf":["Wna","Sro","Zne","Nce","Znl","Wha","Why","Nht","Frc","Bpg","Abi","Qrp",""],"ZbaguTravgvirAnzrf":["Wnahnel","Sroehnel","Znepu","Ncevy","Znl","Whar","Whyl","Nhthfg","Frcgrzore","Bpgbore","Abirzore","Qrprzore",""]}}' + var str3 = + '{"anzr":"ra-HF","ahzoreSbezng":{"PheeraplQrpvznyQvtvgf":2,"PheeraplQrpvznyFrcnengbe":".","VfErnqBayl":snyfr,"PheeraplTebhcFvmrf":[3],"AhzoreTebhcFvmrf":[3],"CrepragTebhcFvmrf":[3],"PheeraplTebhcFrcnengbe":",","PheeraplFlzoby":"$","AnAFlzoby":"AnA","PheeraplArtngvirCnggrea":0,"AhzoreArtngvirCnggrea":1,"CrepragCbfvgvirCnggrea":0,"CrepragArtngvirCnggrea":0,"ArtngvirVasvavglFlzoby":"-Vasvavgl","ArtngvirFvta":"-","AhzoreQrpvznyQvtvgf":2,"AhzoreQrpvznyFrcnengbe":".","AhzoreTebhcFrcnengbe":",","PheeraplCbfvgvirCnggrea":0,"CbfvgvirVasvavglFlzoby":"Vasvavgl","CbfvgvirFvta":"+","CrepragQrpvznyQvtvgf":2,"CrepragQrpvznyFrcnengbe":".","CrepragTebhcFrcnengbe":",","CrepragFlzoby":"%","CreZvyyrFlzoby":"\u2030","AngvirQvtvgf":["0","1","2","3","4","5","6","7","8","9"],"QvtvgFhofgvghgvba":1},"qngrGvzrSbezng":{"NZQrfvtangbe":"NZ","Pnyraqne":{"ZvaFhccbegrqQngrGvzr":"@-62135568000000@","ZnkFhccbegrqQngrGvzr":"@253402300799999@","NytbevguzGlcr":1,"PnyraqneGlcr":1,"Renf":[1],"GjbQvtvgLrneZnk":2029,"VfErnqBayl":snyfr},"QngrFrcnengbe":"/","SvefgQnlBsJrrx":0,"PnyraqneJrrxEhyr":0,"ShyyQngrGvzrCnggrea":"qqqq, ZZZZ qq, llll u:zz:ff gg","YbatQngrCnggrea":"qqqq, ZZZZ qq, llll","YbatGvzrCnggrea":"u:zz:ff gg","ZbaguQnlCnggrea":"ZZZZ qq","CZQrfvtangbe":"CZ","ESP1123Cnggrea":"qqq, qq ZZZ llll UU\':\'zz\':\'ff \'TZG\'","FubegQngrCnggrea":"Z/q/llll","FubegGvzrCnggrea":"u:zz gg","FbegnoyrQngrGvzrCnggrea":"llll\'-\'ZZ\'-\'qq\'G\'UU\':\'zz\':\'ff","GvzrFrcnengbe":":","HavirefnyFbegnoyrQngrGvzrCnggrea":"llll\'-\'ZZ\'-\'qq UU\':\'zz\':\'ff\'M\'","LrneZbaguCnggrea":"ZZZZ, llll","NooerivngrqQnlAnzrf":["Fha","Zba","Ghr","Jrq","Guh","Sev","Fng"],"FubegrfgQnlAnzrf":["Fh","Zb","Gh","Jr","Gu","Se","Fn"],"QnlAnzrf":["Fhaqnl","Zbaqnl","Ghrfqnl","Jrqarfqnl","Guhefqnl","Sevqnl","Fngheqnl"],"NooerivngrqZbaguAnzrf":["Wna","Sro","Zne","Nce","Znl","Wha","Why","Nht","Frc","Bpg","Abi","Qrp",""],"ZbaguAnzrf":["Wnahnel","Sroehnel","Znepu","Ncevy","Znl","Whar","Whyl","Nhthfg","Frcgrzore","Bpgbore","Abirzore","Qrprzore",""],"VfErnqBayl":snyfr,"AngvirPnyraqneAnzr":"Tertbevna Pnyraqne","NooerivngrqZbaguTravgvirAnzrf":["Wna","Sro","Zne","Nce","Znl","Wha","Why","Nht","Frc","Bpg","Abi","Qrp",""],"ZbaguTravgvirAnzrf":["Wnahnel","Sroehnel","Znepu","Ncevy","Znl","Whar","Whyl","Nhthfg","Frcgrzore","Bpgbore","Abirzore","Qrprzore",""]}}' + var str4 = + 'HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str5 = + 'HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + var re18 = /^\s+|\s+$/g + var str6 = 'uggc://jjj.snprobbx.pbz/vaqrk.cuc' + var re19 = /(?:^|\s+)ba(?:\s+|$)/ + var re20 = /[+, ]/ + var re21 = /ybnqrq|pbzcyrgr/ + var str7 = + ';;jvaqbj.IjPurpxZbhfrCbfvgvbaNQ_VQ=shapgvba(r){vs(!r)ine r=jvaqbj.rirag;ine c=-1;vs(d1)c=d1.EbyybssCnary;ine bo=IjTrgBow("IjCnayNQ_VQ_"+c);vs(bo&&bo.fglyr.ivfvovyvgl=="ivfvoyr"){ine fns=IjFns?8:0;ine pheK=r.pyvragK+IjBOFpe("U")+fns,pheL=r.pyvragL+IjBOFpe("I")+fns;ine y=IjBOEC(NQ_VQ,bo,"Y"),g=IjBOEC(NQ_VQ,bo,"G");ine e=y+d1.Cnaryf[c].Jvqgu,o=g+d1.Cnaryf[c].Urvtug;vs((pheKe)||(pheLo)){vs(jvaqbj.IjBaEbyybssNQ_VQ)IjBaEbyybssNQ_VQ(c);ryfr IjPybfrNq(NQ_VQ,c,gehr,"");}ryfr erghea;}IjPnapryZbhfrYvfgrareNQ_VQ();};;jvaqbj.IjFrgEbyybssCnaryNQ_VQ=shapgvba(c){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;c=IjTc(NQ_VQ,c);vs(d1&&d1.EbyybssCnary>-1)IjPnapryZbhfrYvfgrareNQ_VQ();vs(d1)d1.EbyybssCnary=c;gel{vs(q.nqqRiragYvfgrare)q.nqqRiragYvfgrare(z,s,snyfr);ryfr vs(q.nggnpuRirag)q.nggnpuRirag("ba"+z,s);}pngpu(r){}};;jvaqbj.IjPnapryZbhfrYvfgrareNQ_VQ=shapgvba(){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;vs(d1)d1.EbyybssCnary=-1;gel{vs(q.erzbirRiragYvfgrare)q.erzbirRiragYvfgrare(z,s,snyfr);ryfr vs(q.qrgnpuRirag)q.qrgnpuRirag("ba"+z,s);}pngpu(r){}};;d1.IjTc=d2(n,c){ine nq=d1;vs(vfAnA(c)){sbe(ine v=0;v0){vs(nq.FzV.yratgu>0)nq.FzV+="/";nq.FzV+=vh[v];nq.FtZ[nq.FtZ.yratgu]=snyfr;}}};;d1.IjYvzvg0=d2(n,f){ine nq=d1,vh=f.fcyvg("/");sbe(ine v=0;v0){vs(nq.OvC.yratgu>0)nq.OvC+="/";nq.OvC+=vh[v];}}};;d1.IjRVST=d2(n,c){jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]=IjTrgBow("IjCnayNQ_VQ_"+c+"_Bow");vs(jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]==ahyy)frgGvzrbhg("IjRVST(NQ_VQ,"+c+")",d1.rvsg);};;d1.IjNavzSHC=d2(n,c){ine nq=d1;vs(c>nq.Cnaryf.yratgu)erghea;ine cna=nq.Cnaryf[c],nn=gehr,on=gehr,yn=gehr,en=gehr,cn=nq.Cnaryf[0],sf=nq.ShF,j=cn.Jvqgu,u=cn.Urvtug;vs(j=="100%"){j=sf;en=snyfr;yn=snyfr;}vs(u=="100%"){u=sf;nn=snyfr;on=snyfr;}vs(cn.YnY=="Y")yn=snyfr;vs(cn.YnY=="E")en=snyfr;vs(cn.GnY=="G")nn=snyfr;vs(cn.GnY=="O")on=snyfr;ine k=0,l=0;fjvgpu(nq.NshP%8){pnfr 0:oernx;pnfr 1:vs(nn)l=-sf;oernx;pnfr 2:k=j-sf;oernx;pnfr 3:vs(en)k=j;oernx;pnfr 4:k=j-sf;l=u-sf;oernx;pnfr 5:k=j-sf;vs(on)l=u;oernx;pnfr 6:l=u-sf;oernx;pnfr 7:vs(yn)k=-sf;l=u-sf;oernx;}vs(nq.NshP++ 0)||(nethzragf.yratgu==3&&bG>0))){pyrneGvzrbhg(cay.UgU);cay.UgU=frgGvzrbhg(cay.UvqrNpgvba,(nethzragf.yratgu==3?bG:cay.UvqrGvzrbhgInyhr));}};;d1.IjErfrgGvzrbhg=d2(n,c,bG){c=IjTc(n,c);IjPnapryGvzrbhg(n,c);riny("IjFgnegGvzrbhg(NQ_VQ,c"+(nethzragf.yratgu==3?",bG":"")+")");};;d1.IjErfrgNyyGvzrbhgf=d2(n){sbe(ine c=0;ce)||(pheLo)){vs(jvaqbj.IjBaEbyybssNQ_VQ)IjBaEbyybssNQ_VQ(c);ryfr IjPybfrNq(NQ_VQ,c,gehr,"");}ryfr erghea;}IjPnapryZbhfrYvfgrareNQ_VQ();};;jvaqbj.IjFrgEbyybssCnaryNQ_VQ=shapgvba(c){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;c=IjTc(NQ_VQ,c);vs(jvaqbj.IjNqNQ_VQ&&jvaqbj.IjNqNQ_VQ.EbyybssCnary>-1)IjPnapryZbhfrYvfgrareNQ_VQ();vs(jvaqbj.IjNqNQ_VQ)jvaqbj.IjNqNQ_VQ.EbyybssCnary=c;gel{vs(q.nqqRiragYvfgrare)q.nqqRiragYvfgrare(z,s,snyfr);ryfr vs(q.nggnpuRirag)q.nggnpuRirag("ba"+z,s);}pngpu(r){}};;jvaqbj.IjPnapryZbhfrYvfgrareNQ_VQ=shapgvba(){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;vs(jvaqbj.IjNqNQ_VQ)jvaqbj.IjNqNQ_VQ.EbyybssCnary=-1;gel{vs(q.erzbirRiragYvfgrare)q.erzbirRiragYvfgrare(z,s,snyfr);ryfr vs(q.qrgnpuRirag)q.qrgnpuRirag("ba"+z,s);}pngpu(r){}};;jvaqbj.IjNqNQ_VQ.IjTc=shapgvba(n,c){ine nq=jvaqbj.IjNqNQ_VQ;vs(vfAnA(c)){sbe(ine v=0;v0){vs(nq.FzV.yratgu>0)nq.FzV+="/";nq.FzV+=vh[v];nq.FtZ[nq.FtZ.yratgu]=snyfr;}}};;jvaqbj.IjNqNQ_VQ.IjYvzvg0=shapgvba(n,f){ine nq=jvaqbj.IjNqNQ_VQ,vh=f.fcyvg("/");sbe(ine v=0;v0){vs(nq.OvC.yratgu>0)nq.OvC+="/";nq.OvC+=vh[v];}}};;jvaqbj.IjNqNQ_VQ.IjRVST=shapgvba(n,c){jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]=IjTrgBow("IjCnayNQ_VQ_"+c+"_Bow");vs(jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]==ahyy)frgGvzrbhg("IjRVST(NQ_VQ,"+c+")",jvaqbj.IjNqNQ_VQ.rvsg);};;jvaqbj.IjNqNQ_VQ.IjNavzSHC=shapgvba(n,c){ine nq=jvaqbj.IjNqNQ_VQ;vs(c>nq.Cnaryf.yratgu)erghea;ine cna=nq.Cnaryf[c],nn=gehr,on=gehr,yn=gehr,en=gehr,cn=nq.Cnaryf[0],sf=nq.ShF,j=cn.Jvqgu,u=cn.Urvtug;vs(j=="100%"){j=sf;en=snyfr;yn=snyfr;}vs(u=="100%"){u=sf;nn=snyfr;on=snyfr;}vs(cn.YnY=="Y")yn=snyfr;vs(cn.YnY=="E")en=snyfr;vs(cn.GnY=="G")nn=snyfr;vs(cn.GnY=="O")on=snyfr;ine k=0,l=0;fjvgpu(nq.NshP%8){pnfr 0:oernx;pnfr 1:vs(nn)l=-sf;oernx;pnfr 2:k=j-sf;oernx;pnfr 3:vs(en)k=j;oernx;pnfr 4:k=j-sf;l=u-sf;oernx;pnfr 5:k=j-sf;vs(on)l=u;oernx;pnfr 6:l=u-sf;oernx;pnfr 7:vs(yn)k=-sf;l=u-sf;oernx;}vs(nq.NshP++ 0)||(nethzragf.yratgu==3&&bG>0))){pyrneGvzrbhg(cay.UgU);cay.UgU=frgGvzrbhg(cay.UvqrNpgvba,(nethzragf.yratgu==3?bG:cay.UvqrGvzrbhgInyhr));}};;jvaqbj.IjNqNQ_VQ.IjErfrgGvzrbhg=shapgvba(n,c,bG){c=IjTc(n,c);IjPnapryGvzrbhg(n,c);riny("IjFgnegGvzrbhg(NQ_VQ,c"+(nethzragf.yratgu==3?",bG":"")+")");};;jvaqbj.IjNqNQ_VQ.IjErfrgNyyGvzrbhgf=shapgvba(n){sbe(ine c=0;ce)||(pheLo)){vs(jvaqbj.IjBaEbyybssNQ_VQ)IjBaEbyybssNQ_VQ(c);ryfr IjPybfrNq(NQ_VQ,c,gehr,"");}ryfr erghea;}IjPnapryZbhfrYvfgrareNQ_VQ();};;jvaqbj.IjFrgEbyybssCnaryNQ_VQ=shapgvba(c){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;c=IjTc(NQ_VQ,c);vs(jvaqbj.IjNqNQ_VQ&&jvaqbj.IjNqNQ_VQ.EbyybssCnary>-1)IjPnapryZbhfrYvfgrareNQ_VQ();vs(jvaqbj.IjNqNQ_VQ)jvaqbj.IjNqNQ_VQ.EbyybssCnary=c;gel{vs(q.nqqRiragYvfgrare)q.nqqRiragYvfgrare(z,s,snyfr);ryfr vs(q.nggnpuRirag)q.nggnpuRirag("ba"+z,s);}pngpu(r){}};;jvaqbj.IjPnapryZbhfrYvfgrareNQ_VQ=shapgvba(){ine z="zbhfrzbir",q=qbphzrag,s=IjPurpxZbhfrCbfvgvbaNQ_VQ;vs(jvaqbj.IjNqNQ_VQ)jvaqbj.IjNqNQ_VQ.EbyybssCnary=-1;gel{vs(q.erzbirRiragYvfgrare)q.erzbirRiragYvfgrare(z,s,snyfr);ryfr vs(q.qrgnpuRirag)q.qrgnpuRirag("ba"+z,s);}pngpu(r){}};;jvaqbj.IjNqNQ_VQ.IjTc=d2(n,c){ine nq=jvaqbj.IjNqNQ_VQ;vs(vfAnA(c)){sbe(ine v=0;v0){vs(nq.FzV.yratgu>0)nq.FzV+="/";nq.FzV+=vh[v];nq.FtZ[nq.FtZ.yratgu]=snyfr;}}};;jvaqbj.IjNqNQ_VQ.IjYvzvg0=d2(n,f){ine nq=jvaqbj.IjNqNQ_VQ,vh=f.fcyvg("/");sbe(ine v=0;v0){vs(nq.OvC.yratgu>0)nq.OvC+="/";nq.OvC+=vh[v];}}};;jvaqbj.IjNqNQ_VQ.IjRVST=d2(n,c){jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]=IjTrgBow("IjCnayNQ_VQ_"+c+"_Bow");vs(jvaqbj["IjCnayNQ_VQ_"+c+"_Bow"]==ahyy)frgGvzrbhg("IjRVST(NQ_VQ,"+c+")",jvaqbj.IjNqNQ_VQ.rvsg);};;jvaqbj.IjNqNQ_VQ.IjNavzSHC=d2(n,c){ine nq=jvaqbj.IjNqNQ_VQ;vs(c>nq.Cnaryf.yratgu)erghea;ine cna=nq.Cnaryf[c],nn=gehr,on=gehr,yn=gehr,en=gehr,cn=nq.Cnaryf[0],sf=nq.ShF,j=cn.Jvqgu,u=cn.Urvtug;vs(j=="100%"){j=sf;en=snyfr;yn=snyfr;}vs(u=="100%"){u=sf;nn=snyfr;on=snyfr;}vs(cn.YnY=="Y")yn=snyfr;vs(cn.YnY=="E")en=snyfr;vs(cn.GnY=="G")nn=snyfr;vs(cn.GnY=="O")on=snyfr;ine k=0,l=0;fjvgpu(nq.NshP%8){pnfr 0:oernx;pnfr 1:vs(nn)l=-sf;oernx;pnfr 2:k=j-sf;oernx;pnfr 3:vs(en)k=j;oernx;pnfr 4:k=j-sf;l=u-sf;oernx;pnfr 5:k=j-sf;vs(on)l=u;oernx;pnfr 6:l=u-sf;oernx;pnfr 7:vs(yn)k=-sf;l=u-sf;oernx;}vs(nq.NshP++ 0)||(nethzragf.yratgu==3&&bG>0))){pyrneGvzrbhg(cay.UgU);cay.UgU=frgGvzrbhg(cay.UvqrNpgvba,(nethzragf.yratgu==3?bG:cay.UvqrGvzrbhgInyhr));}};;jvaqbj.IjNqNQ_VQ.IjErfrgGvzrbhg=d2(n,c,bG){c=IjTc(n,c);IjPnapryGvzrbhg(n,c);riny("IjFgnegGvzrbhg(NQ_VQ,c"+(nethzragf.yratgu==3?",bG":"")+")");};;jvaqbj.IjNqNQ_VQ.IjErfrgNyyGvzrbhgf=d2(n){sbe(ine c=0;c]/g + var str15 = + 'FrffvbaQQS2=s6r4579npn4rn2135s904r0s75pp1o5334p6s6pospo12696; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669316860113296&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=; AFP_zp_dfctwzs-aowb_80=44132r503660' + var str16 = + 'FrffvbaQQS2=s6r4579npn4rn2135s904r0s75pp1o5334p6s6pospo12696; AFP_zp_dfctwzs-aowb_80=44132r503660; __hgzm=144631658.1231363638.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.965867047679498800.1231363638.1231363638.1231363638.1; __hgzo=144631658.0.10.1231363638; __hgzp=144631658; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669316860113296&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str17 = + 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231363621014&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231363621014&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Scebsvyr.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=348699119.1231363624&tn_fvq=1231363624&tn_uvq=895511034&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22' + var str18 = 'uggc://jjj.yrobapbva.se/yv' + var str19 = + 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669316860113296&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str20 = + 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669316860113296&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + + var s67 = computeInputVariants('e115', 27) + var s68 = computeInputVariants('qvfcynl', 27) + var s69 = computeInputVariants('cbfvgvba', 27) + var s70 = computeInputVariants('uggc://jjj.zlfcnpr.pbz/', 27) + var s71 = computeInputVariants('cntrivrj', 27) + var s72 = computeInputVariants('VC=74.125.75.3', 27) + var s73 = computeInputVariants('ra', 27) + var s74 = computeInputVariants(str10, 27) + var s75 = computeInputVariants(str11, 27) + var s76 = computeInputVariants(str12, 27) + var s77 = computeInputVariants(str17, 27) + var s78 = computeInputVariants(str18, 27) + + function runBlock3() { + for (var i = 0; i < 27; i++) { + s67[i].replace(/[A-Za-z]/g, '') + } + for (var i = 0; i < 23; i++) { + s68[i].replace(re27, '') + s69[i].replace(re27, '') + } + for (var i = 0; i < 22; i++) { + 'unaqyr'.replace(re14, '') + 'unaqyr'.replace(re15, '') + 'yvar'.replace(re14, '') + 'yvar'.replace(re15, '') + 'cnerag puebzr6 fvatyr1 gno'.replace(re14, '') + 'cnerag puebzr6 fvatyr1 gno'.replace(re15, '') + 'fyvqre'.replace(re14, '') + 'fyvqre'.replace(re15, '') + re28.exec('') + } + for (var i = 0; i < 21; i++) { + s70[i].replace(re12, '') + re13.exec(s70[i]) + } + for (var i = 0; i < 20; i++) { + s71[i].replace(re29, '') + s71[i].replace(re30, '') + re19.exec('ynfg') + re19.exec('ba svefg') + re8.exec(s72[i]) + } + for (var i = 0; i < 19; i++) { + re31.exec(s73[i]) + } + for (var i = 0; i < 18; i++) { + s74[i].split(re32) + s75[i].split(re32) + s76[i].replace(re33, '') + re8.exec('144631658.0.10.1231363570') + re8.exec( + '144631658.1231363570.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec( + '144631658.3426875219718084000.1231363570.1231363570.1231363570.1' + ) + re8.exec(str13) + re8.exec(str14) + re8.exec( + '__hgzn=144631658.3426875219718084000.1231363570.1231363570.1231363570.1' + ) + re8.exec('__hgzo=144631658.0.10.1231363570') + re8.exec( + '__hgzm=144631658.1231363570.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re34.exec(s74[i]) + re34.exec(s75[i]) + } + for (var i = 0; i < 17; i++) { + s15[i].match(/zfvr/gi) + s15[i].match(/bcren/gi) + str15.split(re32) + str16.split(re32) + 'ohggba'.replace(re14, '') + 'ohggba'.replace(re15, '') + 'puvyq p1 svefg sylbhg pybfrq'.replace(re14, '') + 'puvyq p1 svefg sylbhg pybfrq'.replace(re15, '') + 'pvgvrf'.replace(re14, '') + 'pvgvrf'.replace(re15, '') + 'pybfrq'.replace(re14, '') + 'pybfrq'.replace(re15, '') + 'qry'.replace(re14, '') + 'qry'.replace(re15, '') + 'uqy_zba'.replace(re14, '') + 'uqy_zba'.replace(re15, '') + s77[i].replace(re33, '') + s78[i].replace(/%3P/g, '') + s78[i].replace(/%3R/g, '') + s78[i].replace(/%3q/g, '') + s78[i].replace(re35, '') + 'yvaxyvfg16'.replace(re14, '') + 'yvaxyvfg16'.replace(re15, '') + 'zvahf'.replace(re14, '') + 'zvahf'.replace(re15, '') + 'bcra'.replace(re14, '') + 'bcra'.replace(re15, '') + 'cnerag puebzr5 fvatyr1 ps NU'.replace(re14, '') + 'cnerag puebzr5 fvatyr1 ps NU'.replace(re15, '') + 'cynlre'.replace(re14, '') + 'cynlre'.replace(re15, '') + 'cyhf'.replace(re14, '') + 'cyhf'.replace(re15, '') + 'cb_uqy'.replace(re14, '') + 'cb_uqy'.replace(re15, '') + 'hyJVzt'.replace(re14, '') + 'hyJVzt'.replace(re15, '') + re8.exec('144631658.0.10.1231363638') + re8.exec( + '144631658.1231363638.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec( + '144631658.965867047679498800.1231363638.1231363638.1231363638.1' + ) + re8.exec('4413268q3660') + re8.exec('4ss747o77904333q374or84qrr1s9r0nprp8r5q81534o94n') + re8.exec('SbeprqRkcvengvba=633669321699093060') + re8.exec('VC=74.125.75.20') + re8.exec(str19) + re8.exec(str20) + re8.exec('AFP_zp_tfwsbrg-aowb_80=4413268q3660') + re8.exec('FrffvbaQQS2=4ss747o77904333q374or84qrr1s9r0nprp8r5q81534o94n') + re8.exec( + '__hgzn=144631658.965867047679498800.1231363638.1231363638.1231363638.1' + ) + re8.exec('__hgzo=144631658.0.10.1231363638') + re8.exec( + '__hgzm=144631658.1231363638.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re34.exec(str15) + re34.exec(str16) + } + } + var re36 = /uers|fep|fryrpgrq/ + var re37 = /\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g + var re38 = /^(\w+|\*)$/ + var str21 = + 'FrffvbaQQS2=s15q53p9n372sn76npr13o271n4s3p5r29p235746p908p58; ZFPhygher=VC=66.249.85.130&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669358527244818&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + var str22 = + 'FrffvbaQQS2=s15q53p9n372sn76npr13o271n4s3p5r29p235746p908p58; __hgzm=144631658.1231367822.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.4127520630321984500.1231367822.1231367822.1231367822.1; __hgzo=144631658.0.10.1231367822; __hgzp=144631658; ZFPhygher=VC=66.249.85.130&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669358527244818&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str23 = + 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231367803797&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231367803797&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Szrffntvat.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1192552091.1231367807&tn_fvq=1231367807&tn_uvq=1155446857&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22' + var str24 = + 'ZFPhygher=VC=66.249.85.130&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669358527244818&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str25 = + 'ZFPhygher=VC=66.249.85.130&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669358527244818&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + var str26 = 'hy.ynat-fryrpgbe' + var re39 = /\\/g + var re40 = / /g + var re41 = /\/\xc4\/t/ + var re42 = /\/\xd6\/t/ + var re43 = /\/\xdc\/t/ + var re44 = /\/\xdf\/t/ + var re45 = /\/\xe4\/t/ + var re46 = /\/\xf6\/t/ + var re47 = /\/\xfc\/t/ + var re48 = /\W/g + var re49 = /uers|fep|fglyr/ + var s79 = computeInputVariants(str21, 16) + var s80 = computeInputVariants(str22, 16) + var s81 = computeInputVariants(str23, 16) + var s82 = computeInputVariants(str26, 16) + + function runBlock4() { + for (var i = 0; i < 16; i++) { + ''.replace(/\*/g, '') + ;/\bnpgvir\b/.exec('npgvir') + ;/sversbk/i.exec(s15[i]) + re36.exec('glcr') + ;/zfvr/i.exec(s15[i]) + ;/bcren/i.exec(s15[i]) + } + for (var i = 0; i < 15; i++) { + s79[i].split(re32) + s80[i].split(re32) + 'uggc://ohyyrgvaf.zlfcnpr.pbz/vaqrk.psz'.replace(re12, '') + s81[i].replace(re33, '') + 'yv'.replace(re37, '') + 'yv'.replace(re18, '') + re8.exec('144631658.0.10.1231367822') + re8.exec( + '144631658.1231367822.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec( + '144631658.4127520630321984500.1231367822.1231367822.1231367822.1' + ) + re8.exec(str24) + re8.exec(str25) + re8.exec( + '__hgzn=144631658.4127520630321984500.1231367822.1231367822.1231367822.1' + ) + re8.exec('__hgzo=144631658.0.10.1231367822') + re8.exec( + '__hgzm=144631658.1231367822.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re34.exec(s79[i]) + re34.exec(s80[i]) + ;/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)["']?(.*?)["']?)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g.exec( + s82[i] + ) + re13.exec('uggc://ohyyrgvaf.zlfcnpr.pbz/vaqrk.psz') + re38.exec('yv') + } + for (var i = 0; i < 14; i++) { + ''.replace(re18, '') + '9.0 e115'.replace(/(\s+e|\s+o[0-9]+)/, '') + 'Funer guvf tnqtrg'.replace(//g, '') + 'Funer guvf tnqtrg'.replace(re39, '') + 'uggc://cebsvyrrqvg.zlfcnpr.pbz/vaqrk.psz'.replace(re12, '') + 'grnfre'.replace(re40, '') + 'grnfre'.replace(re41, '') + 'grnfre'.replace(re42, '') + 'grnfre'.replace(re43, '') + 'grnfre'.replace(re44, '') + 'grnfre'.replace(re45, '') + 'grnfre'.replace(re46, '') + 'grnfre'.replace(re47, '') + 'grnfre'.replace(re48, '') + re16.exec('znetva-gbc') + re16.exec('cbfvgvba') + re19.exec('gno1') + re9.exec('qz') + re9.exec('qg') + re9.exec('zbqobk') + re9.exec('zbqobkva') + re9.exec('zbqgvgyr') + re13.exec('uggc://cebsvyrrqvg.zlfcnpr.pbz/vaqrk.psz') + re26.exec('/vt/znvytnqtrg') + re49.exec('glcr') + } + } + var re50 = /(?:^|\s+)fryrpgrq(?:\s+|$)/ + var re51 = /\&/g + var re52 = /\+/g + var re53 = /\?/g + var re54 = /\t/g + var re55 = /(\$\{nqiHey\})|(\$nqiHey\b)/g + var re56 = /(\$\{cngu\})|(\$cngu\b)/g + function runBlock5() { + for (var i = 0; i < 13; i++) { + 'purpx'.replace(re14, '') + 'purpx'.replace(re15, '') + 'pvgl'.replace(re14, '') + 'pvgl'.replace(re15, '') + 'qrpe fyvqrgrkg'.replace(re14, '') + 'qrpe fyvqrgrkg'.replace(re15, '') + 'svefg fryrpgrq'.replace(re14, '') + 'svefg fryrpgrq'.replace(re15, '') + 'uqy_rag'.replace(re14, '') + 'uqy_rag'.replace(re15, '') + 'vape fyvqrgrkg'.replace(re14, '') + 'vape fyvqrgrkg'.replace(re15, '') + 'vachggrkg QBZPbageby_cynprubyqre'.replace(re5, '') + 'cnerag puebzr6 fvatyr1 gno fryrpgrq'.replace(re14, '') + 'cnerag puebzr6 fvatyr1 gno fryrpgrq'.replace(re15, '') + 'cb_guz'.replace(re14, '') + 'cb_guz'.replace(re15, '') + 'fhozvg'.replace(re14, '') + 'fhozvg'.replace(re15, '') + re50.exec('') + ;/NccyrJroXvg\/([^\s]*)/.exec(s15[i]) + ;/XUGZY/.exec(s15[i]) + } + for (var i = 0; i < 12; i++) { + '${cebg}://${ubfg}${cngu}/${dz}'.replace(/(\$\{cebg\})|(\$cebg\b)/g, '') + '1'.replace(re40, '') + '1'.replace(re10, '') + '1'.replace(re51, '') + '1'.replace(re52, '') + '1'.replace(re53, '') + '1'.replace(re39, '') + '1'.replace(re54, '') + '9.0 e115'.replace(/^(.*)\..*$/, '') + '9.0 e115'.replace(/^.*e(.*)$/, '') + ''.replace(re55, '') + ''.replace( + re55, + '' + ) + s21[i].replace(/^.*\s+(\S+\s+\S+$)/, '') + 'tzk%2Subzrcntr%2Sfgneg%2Sqr%2S'.replace(re30, '') + 'tzk'.replace(re30, '') + 'uggc://${ubfg}${cngu}/${dz}'.replace(/(\$\{ubfg\})|(\$ubfg\b)/g, '') + 'uggc://nqpyvrag.hvzfrei.arg${cngu}/${dz}'.replace(re56, '') + 'uggc://nqpyvrag.hvzfrei.arg/wf.at/${dz}'.replace( + /(\$\{dz\})|(\$dz\b)/g, + '' + ) + 'frpgvba'.replace(re29, '') + 'frpgvba'.replace(re30, '') + 'fvgr'.replace(re29, '') + 'fvgr'.replace(re30, '') + 'fcrpvny'.replace(re29, '') + 'fcrpvny'.replace(re30, '') + re36.exec('anzr') + ;/e/.exec('9.0 e115') + } + } + var re57 = /##yv4##/gi + var re58 = /##yv16##/gi + var re59 = /##yv19##/gi + var str27 = + '##yv4##Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.##yv19##Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.##yv16##Ybgf bs fgbentr (5 TO) - zber pbby fghss ba gur jnl.##OE## ##OE## ##N##Yrnea zber##/N##' + var str28 = + 'Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.##yv19##Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.##yv16##Ybgf bs fgbentr (5 TO) - zber pbby fghss ba gur jnl.##OE## ##OE## ##N##Yrnea zber##/N##' + var str29 = + 'Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.##yv19##Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.Ybgf bs fgbentr (5 TO) - zber pbby fghss ba gur jnl.##OE## ##OE## ##N##Yrnea zber##/N##' + var str30 = + 'Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.Ybgf bs fgbentr (5 TO) - zber pbby fghss ba gur jnl.##OE## ##OE## ##N##Yrnea zber##/N##' + var str31 = + 'Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.Ybgf bs fgbentr (5 TO) - zber pbby fghss ba gur jnl. ##N##Yrnea zber##/N##' + var str32 = + 'Cbjreshy Zvpebfbsg grpuabybtl urycf svtug fcnz naq vzcebir frphevgl.Trg zber qbar gunaxf gb terngre rnfr naq fcrrq.Ybgf bs fgbentr (5 TO) - zber pbby fghss ba gur jnl. Yrnea zber##/N##' + var str33 = + 'Bar Jvaqbjf Yvir VQ trgf lbh vagb Ubgznvy, Zrffratre, Kobk YVIR \u2014 naq bgure cynprf lbh frr #~#argjbexybtb#~#' + var re60 = /(?:^|\s+)bss(?:\s+|$)/ + var re61 = /^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/ + var re62 = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/ + var str34 = '${1}://${2}${3}${4}${5}' + var str35 = + ' O=6gnyg0g4znrrn&o=3&f=gc; Q=_lyu=K3bQZGSxnT4lZzD3OS9GNmV3ZGLkAQxRpTyxNmRlZmRmAmNkAQLRqTImqNZjOUEgpTjQnJ5xMKtgoN--; SCF=qy' + var s83 = computeInputVariants(str27, 11) + var s84 = computeInputVariants(str28, 11) + var s85 = computeInputVariants(str29, 11) + var s86 = computeInputVariants(str30, 11) + var s87 = computeInputVariants(str31, 11) + var s88 = computeInputVariants(str32, 11) + var s89 = computeInputVariants(str33, 11) + var s90 = computeInputVariants(str34, 11) + + function runBlock6() { + for (var i = 0; i < 11; i++) { + s83[i].replace(/##yv0##/gi, '') + s83[i].replace(re57, '') + s84[i].replace(re58, '') + s85[i].replace(re59, '') + s86[i].replace(/##\/o##/gi, '') + s86[i].replace(/##\/v##/gi, '') + s86[i].replace(/##\/h##/gi, '') + s86[i].replace(/##o##/gi, '') + s86[i].replace(/##oe##/gi, '') + s86[i].replace(/##v##/gi, '') + s86[i].replace(/##h##/gi, '') + s87[i].replace(/##n##/gi, '') + s88[i].replace(/##\/n##/gi, '') + s89[i].replace(/#~#argjbexybtb#~#/g, '') + ;/ Zbovyr\//.exec(s15[i]) + ;/##yv1##/gi.exec(s83[i]) + ;/##yv10##/gi.exec(s84[i]) + ;/##yv11##/gi.exec(s84[i]) + ;/##yv12##/gi.exec(s84[i]) + ;/##yv13##/gi.exec(s84[i]) + ;/##yv14##/gi.exec(s84[i]) + ;/##yv15##/gi.exec(s84[i]) + re58.exec(s84[i]) + ;/##yv17##/gi.exec(s85[i]) + ;/##yv18##/gi.exec(s85[i]) + re59.exec(s85[i]) + ;/##yv2##/gi.exec(s83[i]) + ;/##yv20##/gi.exec(s86[i]) + ;/##yv21##/gi.exec(s86[i]) + ;/##yv22##/gi.exec(s86[i]) + ;/##yv23##/gi.exec(s86[i]) + ;/##yv3##/gi.exec(s83[i]) + re57.exec(s83[i]) + ;/##yv5##/gi.exec(s84[i]) + ;/##yv6##/gi.exec(s84[i]) + ;/##yv7##/gi.exec(s84[i]) + ;/##yv8##/gi.exec(s84[i]) + ;/##yv9##/gi.exec(s84[i]) + re8.exec('473qq1rs0n2r70q9qo1pq48n021s9468ron90nps048p4p29') + re8.exec('SbeprqRkcvengvba=633669325184628362') + re8.exec('FrffvbaQQS2=473qq1rs0n2r70q9qo1pq48n021s9468ron90nps048p4p29') + ;/AbxvnA[^\/]*/.exec(s15[i]) + } + for (var i = 0; i < 10; i++) { + ' bss'.replace(/(?:^|\s+)bss(?:\s+|$)/g, '') + s90[i].replace(/(\$\{0\})|(\$0\b)/g, '') + s90[i].replace(/(\$\{1\})|(\$1\b)/g, '') + s90[i].replace(/(\$\{pbzcyrgr\})|(\$pbzcyrgr\b)/g, '') + s90[i].replace(/(\$\{sentzrag\})|(\$sentzrag\b)/g, '') + s90[i].replace(/(\$\{ubfgcbeg\})|(\$ubfgcbeg\b)/g, '') + s90[i].replace(re56, '') + s90[i].replace(/(\$\{cebgbpby\})|(\$cebgbpby\b)/g, '') + s90[i].replace(/(\$\{dhrel\})|(\$dhrel\b)/g, '') + 'nqfvmr'.replace(re29, '') + 'nqfvmr'.replace(re30, '') + 'uggc://${2}${3}${4}${5}'.replace(/(\$\{2\})|(\$2\b)/g, '') + 'uggc://wf.hv-cbegny.qr${3}${4}${5}'.replace(/(\$\{3\})|(\$3\b)/g, '') + 'arjf'.replace(re40, '') + 'arjf'.replace(re41, '') + 'arjf'.replace(re42, '') + 'arjf'.replace(re43, '') + 'arjf'.replace(re44, '') + 'arjf'.replace(re45, '') + 'arjf'.replace(re46, '') + 'arjf'.replace(re47, '') + 'arjf'.replace(re48, '') + ;/ PC=i=(\d+)&oe=(.)/.exec(str35) + re60.exec(' ') + re60.exec(' bss') + re60.exec('') + re19.exec(' ') + re19.exec('svefg ba') + re19.exec('ynfg vtaber') + re19.exec('ba') + re9.exec('scnq so ') + re9.exec('zrqvgobk') + re9.exec('hsgy') + re9.exec('lhv-h') + ;/Fnsnev|Xbadhrebe|XUGZY/gi.exec(s15[i]) + re61.exec('uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/onfr.wf') + re62.exec('#Ybtva_rznvy') + } + } + var re63 = /\{0\}/g + var str36 = + 'FrffvbaQQS2=4ss747o77904333q374or84qrr1s9r0nprp8r5q81534o94n; ZFPhygher=VC=74.125.75.20&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669321699093060&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=; AFP_zp_tfwsbrg-aowb_80=4413268q3660' + var str37 = + 'FrffvbaQQS2=4ss747o77904333q374or84qrr1s9r0nprp8r5q81534o94n; AFP_zp_tfwsbrg-aowb_80=4413268q3660; __hgzm=144631658.1231364074.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.2294274870215848400.1231364074.1231364074.1231364074.1; __hgzo=144631658.0.10.1231364074; __hgzp=144631658; ZFPhygher=VC=74.125.75.20&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669321699093060&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str38 = + 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231364057761&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231364057761&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Ssevraqf.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1667363813.1231364061&tn_fvq=1231364061&tn_uvq=1917563877&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22' + var str39 = + 'ZFPhygher=VC=74.125.75.20&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669321699093060&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str40 = + 'ZFPhygher=VC=74.125.75.20&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669321699093060&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + var s91 = computeInputVariants(str36, 9) + var s92 = computeInputVariants(str37, 9) + var s93 = computeInputVariants(str38, 9) + function runBlock7() { + for (var i = 0; i < 9; i++) { + '0'.replace(re40, '') + '0'.replace(re10, '') + '0'.replace(re51, '') + '0'.replace(re52, '') + '0'.replace(re53, '') + '0'.replace(re39, '') + '0'.replace(re54, '') + 'Lrf'.replace(re40, '') + 'Lrf'.replace(re10, '') + 'Lrf'.replace(re51, '') + 'Lrf'.replace(re52, '') + 'Lrf'.replace(re53, '') + 'Lrf'.replace(re39, '') + 'Lrf'.replace(re54, '') + } + for (var i = 0; i < 8; i++) { + 'Pybfr {0}'.replace(re63, '') + 'Bcra {0}'.replace(re63, '') + s91[i].split(re32) + s92[i].split(re32) + 'puvyq p1 svefg gnournqref'.replace(re14, '') + 'puvyq p1 svefg gnournqref'.replace(re15, '') + 'uqy_fcb'.replace(re14, '') + 'uqy_fcb'.replace(re15, '') + 'uvag'.replace(re14, '') + 'uvag'.replace(re15, '') + s93[i].replace(re33, '') + 'yvfg'.replace(re14, '') + 'yvfg'.replace(re15, '') + 'at_bhgre'.replace(re30, '') + 'cnerag puebzr5 qbhoyr2 NU'.replace(re14, '') + 'cnerag puebzr5 qbhoyr2 NU'.replace(re15, '') + 'cnerag puebzr5 dhnq5 ps NU osyvax zbarl'.replace(re14, '') + 'cnerag puebzr5 dhnq5 ps NU osyvax zbarl'.replace(re15, '') + 'cnerag puebzr6 fvatyr1'.replace(re14, '') + 'cnerag puebzr6 fvatyr1'.replace(re15, '') + 'cb_qrs'.replace(re14, '') + 'cb_qrs'.replace(re15, '') + 'gnopbagrag'.replace(re14, '') + 'gnopbagrag'.replace(re15, '') + 'iv_svefg_gvzr'.replace(re30, '') + ;/(^|.)(ronl|qri-ehf3.wbg)(|fgberf|zbgbef|yvirnhpgvbaf|jvxv|rkcerff|punggre).(pbz(|.nh|.pa|.ux|.zl|.ft|.oe|.zk)|pb(.hx|.xe|.am)|pn|qr|se|vg|ay|or|ng|pu|vr|va|rf|cy|cu|fr)$/i.exec( + 'cntrf.ronl.pbz' + ) + re8.exec('144631658.0.10.1231364074') + re8.exec( + '144631658.1231364074.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec( + '144631658.2294274870215848400.1231364074.1231364074.1231364074.1' + ) + re8.exec('4413241q3660') + re8.exec('SbeprqRkcvengvba=633669357391353591') + re8.exec(str39) + re8.exec(str40) + re8.exec('AFP_zp_kkk-gdzogv_80=4413241q3660') + re8.exec('FrffvbaQQS2=p98s8o9q42nr21or1r61pqorn1n002nsss569635984s6qp7') + re8.exec( + '__hgzn=144631658.2294274870215848400.1231364074.1231364074.1231364074.1' + ) + re8.exec('__hgzo=144631658.0.10.1231364074') + re8.exec( + '__hgzm=144631658.1231364074.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec('p98s8o9q42nr21or1r61pqorn1n002nsss569635984s6qp7') + re34.exec(s91[i]) + re34.exec(s92[i]) + } + } + var re64 = /\b[a-z]/g + var re65 = /^uggc:\/\// + var re66 = /(?:^|\s+)qvfnoyrq(?:\s+|$)/ + var str41 = + 'uggc://cebsvyr.zlfcnpr.pbz/Zbqhyrf/Nccyvpngvbaf/Cntrf/Pnainf.nfck' + function runBlock8() { + for (var i = 0; i < 7; i++) { + s21[i].match(/\d+/g) + 'nsgre'.replace(re64, '') + 'orsber'.replace(re64, '') + 'obggbz'.replace(re64, '') + 'ohvygva_jrngure.kzy'.replace(re65, '') + 'ohggba'.replace(re37, '') + 'ohggba'.replace(re18, '') + 'qngrgvzr.kzy'.replace(re65, '') + 'uggc://eff.paa.pbz/eff/paa_gbcfgbevrf.eff'.replace(re65, '') + 'vachg'.replace(re37, '') + 'vachg'.replace(re18, '') + 'vafvqr'.replace(re64, '') + 'cbvagre'.replace(re27, '') + 'cbfvgvba'.replace(/[A-Z]/g, '') + 'gbc'.replace(re27, '') + 'gbc'.replace(re64, '') + 'hy'.replace(re37, '') + 'hy'.replace(re18, '') + str26.replace(re37, '') + str26.replace(re18, '') + 'lbhghor_vtbbtyr/i2/lbhghor.kzy'.replace(re65, '') + 'm-vaqrk'.replace(re27, '') + ;/#([\w-]+)/.exec(str26) + re16.exec('urvtug') + re16.exec('znetvaGbc') + re16.exec('jvqgu') + re19.exec('gno0 svefg ba') + re19.exec('gno0 ba') + re19.exec('gno4 ynfg') + re19.exec('gno4') + re19.exec('gno5') + re19.exec('gno6') + re19.exec('gno7') + re19.exec('gno8') + ;/NqborNVE\/([^\s]*)/.exec(s15[i]) + ;/NccyrJroXvg\/([^ ]*)/.exec(s15[i]) + ;/XUGZY/gi.exec(s15[i]) + ;/^(?:obql|ugzy)$/i.exec('YV') + re38.exec('ohggba') + re38.exec('vachg') + re38.exec('hy') + re38.exec(str26) + ;/^(\w+|\*)/.exec(str26) + ;/znp|jva|yvahk/i.exec('Jva32') + ;/eton?\([\d\s,]+\)/.exec('fgngvp') + } + for (var i = 0; i < 6; i++) { + ''.replace(/\r/g, '') + '/'.replace(re40, '') + '/'.replace(re10, '') + '/'.replace(re51, '') + '/'.replace(re52, '') + '/'.replace(re53, '') + '/'.replace(re39, '') + '/'.replace(re54, '') + 'uggc://zfacbegny.112.2b7.arg/o/ff/zfacbegnyubzr/1/U.7-cqi-2/{0}?[NDO]&{1}&{2}&[NDR]'.replace( + re63, + '' + ) + str41.replace(re12, '') + 'uggc://jjj.snprobbx.pbz/fepu.cuc'.replace(re23, '') + 'freivpr'.replace(re40, '') + 'freivpr'.replace(re41, '') + 'freivpr'.replace(re42, '') + 'freivpr'.replace(re43, '') + 'freivpr'.replace(re44, '') + 'freivpr'.replace(re45, '') + 'freivpr'.replace(re46, '') + 'freivpr'.replace(re47, '') + 'freivpr'.replace(re48, '') + ;/((ZFVR\s+([6-9]|\d\d)\.))/.exec(s15[i]) + re66.exec('') + re50.exec('fryrpgrq') + re8.exec('8sqq78r9n442851q565599o401385sp3s04r92rnn7o19ssn') + re8.exec('SbeprqRkcvengvba=633669340386893867') + re8.exec('VC=74.125.75.17') + re8.exec('FrffvbaQQS2=8sqq78r9n442851q565599o401385sp3s04r92rnn7o19ssn') + ;/Xbadhrebe|Fnsnev|XUGZY/.exec(s15[i]) + re13.exec(str41) + re49.exec('unfsbphf') + } + } + var re67 = /zrah_byq/g + var str42 = + 'FrffvbaQQS2=473qq1rs0n2r70q9qo1pq48n021s9468ron90nps048p4p29; ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669325184628362&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + var str43 = + 'FrffvbaQQS2=473qq1rs0n2r70q9qo1pq48n021s9468ron90nps048p4p29; __hgzm=144631658.1231364380.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.3931862196947939300.1231364380.1231364380.1231364380.1; __hgzo=144631658.0.10.1231364380; __hgzp=144631658; ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669325184628362&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str44 = + 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_vzntrf_wf&qg=1231364373088&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231364373088&punaary=svz_zlfcnpr_hfre-ivrj-pbzzragf%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Spbzzrag.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1158737789.1231364375&tn_fvq=1231364375&tn_uvq=415520832&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22' + var str45 = + 'ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669325184628362&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str46 = + 'ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669325184628362&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + var re68 = /^([#.]?)((?:[\w\u0128-\uffff*_-]|\\.)*)/ + var re69 = /\{1\}/g + var re70 = /\s+/ + var re71 = /(\$\{4\})|(\$4\b)/g + var re72 = /(\$\{5\})|(\$5\b)/g + var re73 = /\{2\}/g + var re74 = /[^+>] [^+>]/ + var re75 = /\bucpyv\s*=\s*([^;]*)/i + var re76 = /\bucuvqr\s*=\s*([^;]*)/i + var re77 = /\bucfie\s*=\s*([^;]*)/i + var re78 = /\bhfucjrn\s*=\s*([^;]*)/i + var re79 = /\bmvc\s*=\s*([^;]*)/i + var re80 = + /^((?:[\w\u0128-\uffff*_-]|\\.)+)(#)((?:[\w\u0128-\uffff*_-]|\\.)+)/ + var re81 = /^([>+~])\s*(\w*)/i + var re82 = /^>\s*((?:[\w\u0128-\uffff*_-]|\\.)+)/ + var re83 = /^[\s[]?shapgvba/ + var re84 = /v\/g.tvs#(.*)/i + var str47 = '#Zbq-Vasb-Vasb-WninFpevcgUvag' + var str48 = ',n.svryqOgaPnapry' + var str49 = + 'FrffvbaQQS2=p98s8o9q42nr21or1r61pqorn1n002nsss569635984s6qp7; ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669357391353591&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=; AFP_zp_kkk-gdzogv_80=4413241q3660' + var str50 = + 'FrffvbaQQS2=p98s8o9q42nr21or1r61pqorn1n002nsss569635984s6qp7; AFP_zp_kkk-gdzogv_80=4413241q3660; AFP_zp_kkk-aowb_80=4413235p3660; __hgzm=144631658.1231367708.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.2770915348920628700.1231367708.1231367708.1231367708.1; __hgzo=144631658.0.10.1231367708; __hgzp=144631658; ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669357391353591&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str51 = + 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231367691141&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231367691141&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Sjjj.zlfcnpr.pbz%2S&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=320757904.1231367694&tn_fvq=1231367694&tn_uvq=1758792003&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22' + var str52 = + 'uggc://zfacbegny.112.2b7.arg/o/ff/zfacbegnyubzr/1/U.7-cqi-2/f55332979829981?[NDO]&aqu=1&g=7%2S0%2S2009%2014%3N38%3N42%203%20480&af=zfacbegny&cntrAnzr=HF%20UCZFSGJ&t=uggc%3N%2S%2Sjjj.zfa.pbz%2S&f=1024k768&p=24&x=L&oj=994&ou=634&uc=A&{2}&[NDR]' + var str53 = 'cnerag puebzr6 fvatyr1 gno fryrpgrq ovaq qbhoyr2 ps' + var str54 = + 'ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669357391353591&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str55 = + 'ZFPhygher=VC=74.125.75.3&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669357391353591&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + var str56 = + 'ne;ng;nh;or;oe;pn;pu;py;pa;qr;qx;rf;sv;se;to;ux;vq;vr;va;vg;wc;xe;zk;zl;ay;ab;am;cu;cy;cg;eh;fr;ft;gu;ge;gj;mn;' + var str57 = + 'ZP1=I=3&THVQ=6nnpr9q661804s33nnop45nosqp17q85; zu=ZFSG; PHYGHER=RA-HF; SyvtugTebhcVq=97; SyvtugVq=OnfrCntr; ucfie=Z:5|S:5|G:5|R:5|Q:oyh|J:S; ucpyv=J.U|Y.|F.|E.|H.Y|P.|U.; hfucjrn=jp:HFPN0746; ZHVQ=Q783SN9O14054831N4869R51P0SO8886&GHVQ=1' + var str58 = + 'ZP1=I=3&THVQ=6nnpr9q661804s33nnop45nosqp17q85; zu=ZFSG; PHYGHER=RA-HF; SyvtugTebhcVq=97; SyvtugVq=OnfrCntr; ucfie=Z:5|S:5|G:5|R:5|Q:oyh|J:S; ucpyv=J.U|Y.|F.|E.|H.Y|P.|U.; hfucjrn=jp:HFPN0746; ZHVQ=Q783SN9O14054831N4869R51P0SO8886' + var str59 = + 'ZP1=I=3&THVQ=6nnpr9q661804s33nnop45nosqp17q85; zu=ZFSG; PHYGHER=RA-HF; SyvtugTebhcVq=97; SyvtugVq=OnfrCntr; ucfie=Z:5|S:5|G:5|R:5|Q:oyh|J:S; ucpyv=J.U|Y.|F.|E.|H.Y|P.|U.; hfucjrn=jp:HFPN0746; ZHVQ=Q783SN9O14054831N4869R51P0SO8886; mvc=m:94043|yn:37.4154|yb:-122.0585|p:HF|ue:1' + var str60 = + 'ZP1=I=3&THVQ=6nnpr9q661804s33nnop45nosqp17q85; zu=ZFSG; PHYGHER=RA-HF; SyvtugTebhcVq=97; SyvtugVq=OnfrCntr; ucfie=Z:5|S:5|G:5|R:5|Q:oyh|J:S; ucpyv=J.U|Y.|F.|E.|H.Y|P.|U.; hfucjrn=jp:HFPN0746; ZHVQ=Q783SN9O14054831N4869R51P0SO8886; mvc=m:94043|yn:37.4154|yb:-122.0585|p:HF' + var str61 = + 'uggc://gx2.fgp.f-zfa.pbz/oe/uc/11/ra-hf/pff/v/g.tvs#uggc://gx2.fgo.f-zfa.pbz/v/29/4RQP4969777N048NPS4RRR3PO2S7S.wct' + var str62 = + 'uggc://gx2.fgp.f-zfa.pbz/oe/uc/11/ra-hf/pff/v/g.tvs#uggc://gx2.fgo.f-zfa.pbz/v/OQ/63NP9O94NS5OQP1249Q9S1ROP7NS3.wct' + var str63 = + 'zbmvyyn/5.0 (jvaqbjf; h; jvaqbjf ag 5.1; ra-hf) nccyrjroxvg/528.9 (xugzy, yvxr trpxb) puebzr/2.0.157.0 fnsnev/528.9' + var s94 = computeInputVariants(str42, 5) + var s95 = computeInputVariants(str43, 5) + var s96 = computeInputVariants(str44, 5) + var s97 = computeInputVariants(str47, 5) + var s98 = computeInputVariants(str48, 5) + var s99 = computeInputVariants(str49, 5) + var s100 = computeInputVariants(str50, 5) + var s101 = computeInputVariants(str51, 5) + var s102 = computeInputVariants(str52, 5) + var s103 = computeInputVariants(str53, 5) + + function runBlock9() { + for (var i = 0; i < 5; i++) { + s94[i].split(re32) + s95[i].split(re32) + 'svz_zlfcnpr_hfre-ivrj-pbzzragf,svz_zlfcnpr_havgrq-fgngrf'.split(re20) + s96[i].replace(re33, '') + 'zrah_arj zrah_arj_gbttyr zrah_gbttyr'.replace(re67, '') + 'zrah_byq zrah_byq_gbttyr zrah_gbttyr'.replace(re67, '') + re8.exec('102n9o0o9pq60132qn0337rr867p75953502q2s27s2s5r98') + re8.exec('144631658.0.10.1231364380') + re8.exec( + '144631658.1231364380.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec( + '144631658.3931862196947939300.1231364380.1231364380.1231364380.1' + ) + re8.exec('441326q33660') + re8.exec('SbeprqRkcvengvba=633669341278771470') + re8.exec(str45) + re8.exec(str46) + re8.exec('AFP_zp_dfctwzssrwh-aowb_80=441326q33660') + re8.exec('FrffvbaQQS2=102n9o0o9pq60132qn0337rr867p75953502q2s27s2s5r98') + re8.exec( + '__hgzn=144631658.3931862196947939300.1231364380.1231364380.1231364380.1' + ) + re8.exec('__hgzo=144631658.0.10.1231364380') + re8.exec( + '__hgzm=144631658.1231364380.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + } + for (var i = 0; i < 4; i++) { + ' yvfg1'.replace(re14, '') + ' yvfg1'.replace(re15, '') + ' yvfg2'.replace(re14, '') + ' yvfg2'.replace(re15, '') + ' frneputebhc1'.replace(re14, '') + ' frneputebhc1'.replace(re15, '') + s97[i].replace(re68, '') + s97[i].replace(re18, '') + ''.replace(/&/g, '') + ''.replace(re35, '') + '(..-{0})(|(d+)|)'.replace(re63, '') + s98[i].replace(re18, '') + '//vzt.jro.qr/vij/FC/${cngu}/${anzr}/${inyhr}?gf=${abj}'.replace(re56, '') + '//vzt.jro.qr/vij/FC/tzk_uc/${anzr}/${inyhr}?gf=${abj}'.replace( + /(\$\{anzr\})|(\$anzr\b)/g, + '' + ) + 'Jvaqbjf Yvir Ubgznvy{1}'.replace( + re69, + '' + ) + '{0}{1}'.replace( + re63, + '' + ) + '{1}'.replace( + re69, + '' + ) + '{1}'.replace(re63, '') + 'Vzntrf'.replace(re15, '') + 'ZFA'.replace(re15, '') + 'Zncf'.replace(re15, '') + 'Zbq-Vasb-Vasb-WninFpevcgUvag'.replace(re39, '') + 'Arjf'.replace(re15, '') + s99[i].split(re32) + s100[i].split(re32) + 'Ivqrb'.replace(re15, '') + 'Jro'.replace(re15, '') + 'n'.replace(re39, '') + 'nwnkFgneg'.split(re70) + 'nwnkFgbc'.split(re70) + 'ovaq'.replace(re14, '') + 'ovaq'.replace(re15, '') + 'oevatf lbh zber. Zber fcnpr (5TO), zber frphevgl, fgvyy serr.'.replace( + re63, + '' + ) + 'puvyq p1 svefg qrpx'.replace(re14, '') + 'puvyq p1 svefg qrpx'.replace(re15, '') + 'puvyq p1 svefg qbhoyr2'.replace(re14, '') + 'puvyq p1 svefg qbhoyr2'.replace(re15, '') + 'puvyq p2 ynfg'.replace(re14, '') + 'puvyq p2 ynfg'.replace(re15, '') + 'puvyq p2'.replace(re14, '') + 'puvyq p2'.replace(re15, '') + 'puvyq p3'.replace(re14, '') + 'puvyq p3'.replace(re15, '') + 'puvyq p4 ynfg'.replace(re14, '') + 'puvyq p4 ynfg'.replace(re15, '') + 'pbclevtug'.replace(re14, '') + 'pbclevtug'.replace(re15, '') + 'qZFAZR_1'.replace(re14, '') + 'qZFAZR_1'.replace(re15, '') + 'qbhoyr2 ps'.replace(re14, '') + 'qbhoyr2 ps'.replace(re15, '') + 'qbhoyr2'.replace(re14, '') + 'qbhoyr2'.replace(re15, '') + 'uqy_arj'.replace(re14, '') + 'uqy_arj'.replace(re15, '') + 'uc_fubccvatobk'.replace(re30, '') + 'ugzy%2Rvq'.replace(re29, '') + 'ugzy%2Rvq'.replace(re30, '') + s101[i].replace(re33, '') + 'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/cebgbglcr.wf${4}${5}'.replace( + re71, + '' + ) + 'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/cebgbglcr.wf${5}'.replace( + re72, + '' + ) + s102[i].replace(re73, '') + 'uggc://zfacbegny.112.2b7.arg/o/ff/zfacbegnyubzr/1/U.7-cqi-2/f55332979829981?[NDO]&{1}&{2}&[NDR]'.replace( + re69, + '' + ) + 'vztZFSG'.replace(re14, '') + 'vztZFSG'.replace(re15, '') + 'zfasbbg1 ps'.replace(re14, '') + 'zfasbbg1 ps'.replace(re15, '') + s103[i].replace(re14, '') + s103[i].replace(re15, '') + 'cnerag puebzr6 fvatyr1 gno fryrpgrq ovaq'.replace(re14, '') + 'cnerag puebzr6 fvatyr1 gno fryrpgrq ovaq'.replace(re15, '') + 'cevznel'.replace(re14, '') + 'cevznel'.replace(re15, '') + 'erpgnatyr'.replace(re30, '') + 'frpbaqnel'.replace(re14, '') + 'frpbaqnel'.replace(re15, '') + 'haybnq'.split(re70) + '{0}{1}1'.replace(re63, '') + '|{1}1'.replace(re69, '') + ;/(..-HF)(\|(\d+)|)/i.exec('xb-xe,ra-va,gu-gu') + re4.exec('/ZlFcnprNccf/NccPnainf,45000012') + re8.exec('144631658.0.10.1231367708') + re8.exec( + '144631658.1231367708.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec( + '144631658.2770915348920628700.1231367708.1231367708.1231367708.1' + ) + re8.exec('4413235p3660') + re8.exec('441327q73660') + re8.exec('9995p6rp12rrnr893334ro7nq70o7p64p69rqn844prs1473') + re8.exec('SbeprqRkcvengvba=633669350559478880') + re8.exec(str54) + re8.exec(str55) + re8.exec('AFP_zp_dfctwzs-aowb_80=441327q73660') + re8.exec('AFP_zp_kkk-aowb_80=4413235p3660') + re8.exec('FrffvbaQQS2=9995p6rp12rrnr893334ro7nq70o7p64p69rqn844prs1473') + re8.exec( + '__hgzn=144631658.2770915348920628700.1231367708.1231367708.1231367708.1' + ) + re8.exec('__hgzo=144631658.0.10.1231367708') + re8.exec( + '__hgzm=144631658.1231367708.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re34.exec(s99[i]) + re34.exec(s100[i]) + ;/ZFVR\s+5[.]01/.exec(s15[i]) + ;/HF(?=;)/i.exec(str56) + re74.exec(s97[i]) + re28.exec('svefg npgvir svefgNpgvir') + re28.exec('ynfg') + ;/\bp:(..)/i.exec('m:94043|yn:37.4154|yb:-122.0585|p:HF') + re75.exec(str57) + re75.exec(str58) + re76.exec(str57) + re76.exec(str58) + re77.exec(str57) + re77.exec(str58) + ;/\bhfucce\s*=\s*([^;]*)/i.exec(str59) + re78.exec(str57) + re78.exec(str58) + ;/\bjci\s*=\s*([^;]*)/i.exec(str59) + re79.exec(str58) + re79.exec(str60) + re79.exec(str59) + ;/\|p:([a-z]{2})/i.exec('m:94043|yn:37.4154|yb:-122.0585|p:HF|ue:1') + re80.exec(s97[i]) + re61.exec('cebgbglcr.wf') + re68.exec(s97[i]) + re81.exec(s97[i]) + re82.exec(s97[i]) + ;/^Fubpxjnir Synfu (\d)/.exec(s21[i]) + ;/^Fubpxjnir Synfu (\d+)/.exec(s21[i]) + re83.exec('[bowrpg tybony]') + re62.exec(s97[i]) + re84.exec(str61) + re84.exec(str62) + ;/jroxvg/.exec(str63) + } + } + var re85 = /eaq_zbqobkva/ + var str64 = '1231365729213' + var str65 = '74.125.75.3-1057165600.29978900' + var str66 = '74.125.75.3-1057165600.29978900.1231365730214' + var str67 = 'Frnepu%20Zvpebfbsg.pbz' + var str68 = + 'FrffvbaQQS2=8sqq78r9n442851q565599o401385sp3s04r92rnn7o19ssn; ZFPhygher=VC=74.125.75.17&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669340386893867&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + var str69 = + 'FrffvbaQQS2=8sqq78r9n442851q565599o401385sp3s04r92rnn7o19ssn; __hgzm=144631658.1231365779.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.1877536177953918500.1231365779.1231365779.1231365779.1; __hgzo=144631658.0.10.1231365779; __hgzp=144631658; ZFPhygher=VC=74.125.75.17&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669340386893867&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str70 = 'I=3%26THVQ=757q3ss871q44o7o805n8113n5p72q52' + var str71 = 'I=3&THVQ=757q3ss871q44o7o805n8113n5p72q52' + var str72 = + 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231365765292&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231365765292&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Sohyyrgvaf.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1579793869.1231365768&tn_fvq=1231365768&tn_uvq=2056210897&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22' + var str73 = 'frnepu.zvpebfbsg.pbz' + var str74 = 'frnepu.zvpebfbsg.pbz/' + var str75 = + 'ZFPhygher=VC=74.125.75.17&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669340386893867&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str76 = + 'ZFPhygher=VC=74.125.75.17&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669340386893867&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + function runBlock10() { + for (var i = 0; i < 3; i++) { + '%3Szxg=ra-HF'.replace(re39, '') + '-8'.replace(re40, '') + '-8'.replace(re10, '') + '-8'.replace(re51, '') + '-8'.replace(re52, '') + '-8'.replace(re53, '') + '-8'.replace(re39, '') + '-8'.replace(re54, '') + '1.5'.replace(re40, '') + '1.5'.replace(re10, '') + '1.5'.replace(re51, '') + '1.5'.replace(re52, '') + '1.5'.replace(re53, '') + '1.5'.replace(re39, '') + '1.5'.replace(re54, '') + '1024k768'.replace(re40, '') + '1024k768'.replace(re10, '') + '1024k768'.replace(re51, '') + '1024k768'.replace(re52, '') + '1024k768'.replace(re53, '') + '1024k768'.replace(re39, '') + '1024k768'.replace(re54, '') + str64.replace(re40, '') + str64.replace(re10, '') + str64.replace(re51, '') + str64.replace(re52, '') + str64.replace(re53, '') + str64.replace(re39, '') + str64.replace(re54, '') + '14'.replace(re40, '') + '14'.replace(re10, '') + '14'.replace(re51, '') + '14'.replace(re52, '') + '14'.replace(re53, '') + '14'.replace(re39, '') + '14'.replace(re54, '') + '24'.replace(re40, '') + '24'.replace(re10, '') + '24'.replace(re51, '') + '24'.replace(re52, '') + '24'.replace(re53, '') + '24'.replace(re39, '') + '24'.replace(re54, '') + str65.replace(re40, '') + str65.replace(re10, '') + str65.replace(re51, '') + str65.replace(re52, '') + str65.replace(re53, '') + str65.replace(re39, '') + str65.replace(re54, '') + str66.replace(re40, '') + str66.replace(re10, '') + str66.replace(re51, '') + str66.replace(re52, '') + str66.replace(re53, '') + str66.replace(re39, '') + str66.replace(re54, '') + '9.0'.replace(re40, '') + '9.0'.replace(re10, '') + '9.0'.replace(re51, '') + '9.0'.replace(re52, '') + '9.0'.replace(re53, '') + '9.0'.replace(re39, '') + '9.0'.replace(re54, '') + '994k634'.replace(re40, '') + '994k634'.replace(re10, '') + '994k634'.replace(re51, '') + '994k634'.replace(re52, '') + '994k634'.replace(re53, '') + '994k634'.replace(re39, '') + '994k634'.replace(re54, '') + '?zxg=ra-HF'.replace(re40, '') + '?zxg=ra-HF'.replace(re10, '') + '?zxg=ra-HF'.replace(re51, '') + '?zxg=ra-HF'.replace(re52, '') + '?zxg=ra-HF'.replace(re53, '') + '?zxg=ra-HF'.replace(re54, '') + 'PAA.pbz'.replace(re25, '') + 'PAA.pbz'.replace(re12, '') + 'PAA.pbz'.replace(re39, '') + 'Qngr & Gvzr'.replace(re25, '') + 'Qngr & Gvzr'.replace(re12, '') + 'Qngr & Gvzr'.replace(re39, '') + 'Frnepu Zvpebfbsg.pbz'.replace(re40, '') + 'Frnepu Zvpebfbsg.pbz'.replace(re54, '') + str67.replace(re10, '') + str67.replace(re51, '') + str67.replace(re52, '') + str67.replace(re53, '') + str67.replace(re39, '') + str68.split(re32) + str69.split(re32) + str70.replace(re52, '') + str70.replace(re53, '') + str70.replace(re39, '') + str71.replace(re40, '') + str71.replace(re10, '') + str71.replace(re51, '') + str71.replace(re54, '') + 'Jrngure'.replace(re25, '') + 'Jrngure'.replace(re12, '') + 'Jrngure'.replace(re39, '') + 'LbhGhor'.replace(re25, '') + 'LbhGhor'.replace(re12, '') + 'LbhGhor'.replace(re39, '') + str72.replace(re33, '') + 'erzbgr_vsenzr_1'.replace(/^erzbgr_vsenzr_/, '') + str73.replace(re40, '') + str73.replace(re10, '') + str73.replace(re51, '') + str73.replace(re52, '') + str73.replace(re53, '') + str73.replace(re39, '') + str73.replace(re54, '') + str74.replace(re40, '') + str74.replace(re10, '') + str74.replace(re51, '') + str74.replace(re52, '') + str74.replace(re53, '') + str74.replace(re39, '') + str74.replace(re54, '') + 'lhv-h'.replace(/\-/g, '') + re9.exec('p') + re9.exec('qz p') + re9.exec('zbqynory') + re9.exec('lhv-h svefg') + re8.exec('144631658.0.10.1231365779') + re8.exec( + '144631658.1231365779.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec( + '144631658.1877536177953918500.1231365779.1231365779.1231365779.1' + ) + re8.exec(str75) + re8.exec(str76) + re8.exec( + '__hgzn=144631658.1877536177953918500.1231365779.1231365779.1231365779.1' + ) + re8.exec('__hgzo=144631658.0.10.1231365779') + re8.exec( + '__hgzm=144631658.1231365779.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re34.exec(str68) + re34.exec(str69) + ;/^$/.exec('') + re31.exec('qr') + ;/^znk\d+$/.exec('') + ;/^zva\d+$/.exec('') + ;/^erfgber$/.exec('') + re85.exec('zbqobkva zbqobk_abcnqqvat ') + re85.exec('zbqgvgyr') + re85.exec('eaq_zbqobkva ') + re85.exec('eaq_zbqgvgyr ') + ;/frpgvba\d+_pbagragf/.exec('obggbz_ani') + } + } + var re86 = /;\s*/ + var re87 = /(\$\{inyhr\})|(\$inyhr\b)/g + var re88 = /(\$\{abj\})|(\$abj\b)/g + var re89 = /\s+$/ + var re90 = /^\s+/ + var re91 = + /(\\\"|\x00-|\x1f|\x7f-|\x9f|\u00ad|\u0600-|\u0604|\u070f|\u17b4|\u17b5|\u200c-|\u200f|\u2028-|\u202f|\u2060-|\u206f|\ufeff|\ufff0-|\uffff)/g + var re92 = /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/ + var re93 = /^([:.#]*)((?:[\w\u0128-\uffff*_-]|\\.)+)/ + var re94 = /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/ + var str77 = '#fubhgobk .pybfr' + var str78 = + 'FrffvbaQQS2=102n9o0o9pq60132qn0337rr867p75953502q2s27s2s5r98; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669341278771470&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=; AFP_zp_dfctwzssrwh-aowb_80=441326q33660' + var str79 = + 'FrffvbaQQS2=102n9o0o9pq60132qn0337rr867p75953502q2s27s2s5r98; AFP_zp_dfctwzssrwh-aowb_80=441326q33660; __hgzm=144631658.1231365869.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.1670816052019209000.1231365869.1231365869.1231365869.1; __hgzo=144631658.0.10.1231365869; __hgzp=144631658; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669341278771470&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str80 = + 'FrffvbaQQS2=9995p6rp12rrnr893334ro7nq70o7p64p69rqn844prs1473; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669350559478880&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=; AFP_zp_dfctwzs-aowb_80=441327q73660' + var str81 = + 'FrffvbaQQS2=9995p6rp12rrnr893334ro7nq70o7p64p69rqn844prs1473; AFP_zp_dfctwzs-aowb_80=441327q73660; __hgzm=144631658.1231367054.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar); __hgzn=144631658.1796080716621419500.1231367054.1231367054.1231367054.1; __hgzo=144631658.0.10.1231367054; __hgzp=144631658; ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669350559478880&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str82 = '[glcr=fhozvg]' + var str83 = 'n.svryqOga,n.svryqOgaPnapry' + var str84 = 'n.svryqOgaPnapry' + var str85 = 'oyvpxchaxg' + var str86 = 'qvi.bow-nppbeqvba qg' + var str87 = + 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_nccf_wf&qg=1231367052227&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231367052227&punaary=svz_zlfcnpr_nccf-pnainf%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Scebsvyr.zlfcnpr.pbz%2SZbqhyrf%2SNccyvpngvbaf%2SCntrf%2SPnainf.nfck&nq_glcr=grkg&rvq=6083027&rn=0&sez=1&tn_ivq=716357910.1231367056&tn_fvq=1231367056&tn_uvq=1387206491&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22' + var str88 = + 'uggc://tbbtyrnqf.t.qbhoyrpyvpx.arg/cntrnq/nqf?pyvrag=pn-svz_zlfcnpr_zlfcnpr-ubzrcntr_wf&qg=1231365851658&uy=ra&nqfnsr=uvtu&br=hgs8&ahz_nqf=4&bhgchg=wf&nqgrfg=bss&pbeeryngbe=1231365851658&punaary=svz_zlfcnpr_ubzrcntr_abgybttrqva%2Psvz_zlfcnpr_aba_HTP%2Psvz_zlfcnpr_havgrq-fgngrf&hey=uggc%3N%2S%2Scebsvyrrqvg.zlfcnpr.pbz%2Svaqrk.psz&nq_glcr=grkg&rvq=6083027&rn=0&sez=0&tn_ivq=1979828129.1231365855&tn_fvq=1231365855&tn_uvq=2085229649&synfu=9.0.115&h_u=768&h_j=1024&h_nu=738&h_nj=1024&h_pq=24&h_gm=-480&h_uvf=2&h_wnin=gehr&h_acyht=7&h_azvzr=22' + var str89 = + 'uggc://zfacbegny.112.2b7.arg/o/ff/zfacbegnyubzr/1/U.7-cqi-2/f55023338617756?[NDO]&aqu=1&g=7%2S0%2S2009%2014%3N12%3N47%203%20480&af=zfacbegny&cntrAnzr=HF%20UCZFSGJ&t=uggc%3N%2S%2Sjjj.zfa.pbz%2S&f=0k0&p=43835816&x=A&oj=994&ou=634&uc=A&{2}&[NDR]' + var str90 = 'zrgn[anzr=nwnkHey]' + var str91 = 'anpuevpugra' + var str92 = + "b oS={'oT':1.1};x $8n(B){z(B!=o9)};x $S(B){O(!$8n(B))z A;O(B.4L)z'T';b S=7t B;O(S=='2P'&&B.p4){23(B.7f){12 1:z'T';12 3:z/S/.2g(B.8M)?'ox':'oh'}}O(S=='2P'||S=='x'){23(B.nE){12 2V:z'1O';12 7I:z'5a';12 18:z'4B'}O(7t B.I=='4F'){O(B.3u)z'pG';O(B.8e)z'1p'}}z S};x $2p(){b 4E={};Z(b v=0;v<1p.I;v++){Z(b X 1o 1p[v]){b nc=1p[v][X];b 6E=4E[X];O(6E&&$S(nc)=='2P'&&$S(6E)=='2P')4E[X]=$2p(6E,nc);17 4E[X]=nc}}z 4E};b $E=7p.E=x(){b 1d=1p;O(!1d[1])1d=[p,1d[0]];Z(b X 1o 1d[1])1d[0][X]=1d[1][X];z 1d[0]};b $4D=7p.pJ=x(){Z(b v=0,y=1p.I;v-1:p.3F(2R)>-1},nX:x(){z p.3y(/([.*+?^${}()|[]/\\])/t,'\\$1')}});2V.E({5V:x(1O){O(p.I<3)z A;O(p.I==4&&p[3]==0&&!1O)z'p5';b 3P=[];Z(b v=0;v<3;v++){b 52=(p[v]-0).4h(16);3P.1x((52.I==1)?'0'+52:52)}z 1O?3P:'#'+3P.2u('')},5U:x(1O){O(p.I!=3)z A;b 1i=[];Z(b v=0;v<3;v++){1i.1x(5K((p[v].I==1)?p[v]+p[v]:p[v],16))}z 1O?1i:'1i('+1i.2u(',')+')'}});7F.E({3n:x(P){b J=p;P=$2p({'L':J,'V':A,'1p':1S,'2x':A,'4s':A,'6W':A},P);O($2O(P.1p)&&$S(P.1p)!='1O')P.1p=[P.1p];z x(V){b 1d;O(P.V){V=V||H.V;1d=[(P.V===1r)?V:Y P.V(V)];O(P.1p)1d.E(P.1p)}17 1d=P.1p||1p;b 3C=x(){z J.3H($5S(P" + var str93 = 'hagreunyghat' + var str94 = + 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669341278771470&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str95 = + 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&Pbhagel=IIZ%3Q&SbeprqRkcvengvba=633669350559478880&gvzrMbar=-8&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R%3Q' + var str96 = + 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669341278771470&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + var str97 = + 'ZFPhygher=VC=74.125.75.1&VCPhygher=ra-HF&CersreerqPhygher=ra-HF&CersreerqPhygherCraqvat=&Pbhagel=IIZ=&SbeprqRkcvengvba=633669350559478880&gvzrMbar=0&HFEYBP=DKWyLHAiMTH9AwHjWxAcqUx9GJ91oaEunJ4tIzyyqlMQo3IhqUW5D29xMG1IHlMQo3IhqUW5GzSgMG1Iozy0MJDtH3EuqTImWxEgLHAiMTH9BQN3WxkuqTy0qJEyCGZ3YwDkBGVzGT9hM2y0qJEyCF0kZwVhZQH3APMDo3A0LJkQo2EyCGx0ZQDmWyWyM2yiox5uoJH9D0R=' + var str98 = + 'shapgvba (){Cuk.Nccyvpngvba.Frghc.Pber();Cuk.Nccyvpngvba.Frghc.Nwnk();Cuk.Nccyvpngvba.Frghc.Synfu();Cuk.Nccyvpngvba.Frghc.Zbqhyrf()}' + function runBlock11() { + for (var i = 0; i < 2; i++) { + ' .pybfr'.replace(re18, '') + ' n.svryqOgaPnapry'.replace(re18, '') + ' qg'.replace(re18, '') + str77.replace(re68, '') + str77.replace(re18, '') + ''.replace(re39, '') + ''.replace(/^/, '') + ''.split(re86) + '*'.replace(re39, '') + '*'.replace(re68, '') + '*'.replace(re18, '') + '.pybfr'.replace(re68, '') + '.pybfr'.replace(re18, '') + '//vzt.jro.qr/vij/FC/tzk_uc/fperra/${inyhr}?gf=${abj}'.replace(re87, '') + '//vzt.jro.qr/vij/FC/tzk_uc/fperra/1024?gf=${abj}'.replace(re88, '') + '//vzt.jro.qr/vij/FC/tzk_uc/jvafvmr/${inyhr}?gf=${abj}'.replace(re87, '') + '//vzt.jro.qr/vij/FC/tzk_uc/jvafvmr/992/608?gf=${abj}'.replace(re88, '') + '300k120'.replace(re30, '') + '300k250'.replace(re30, '') + '310k120'.replace(re30, '') + '310k170'.replace(re30, '') + '310k250'.replace(re30, '') + '9.0 e115'.replace(/^.*\.(.*)\s.*$/, '') + 'Nppbeqvba'.replace(re2, '') + 'Nxghryy\x0a'.replace(re89, '') + 'Nxghryy\x0a'.replace(re90, '') + 'Nccyvpngvba'.replace(re2, '') + 'Oyvpxchaxg\x0a'.replace(re89, '') + 'Oyvpxchaxg\x0a'.replace(re90, '') + 'Svanamra\x0a'.replace(re89, '') + 'Svanamra\x0a'.replace(re90, '') + 'Tnzrf\x0a'.replace(re89, '') + 'Tnzrf\x0a'.replace(re90, '') + 'Ubebfxbc\x0a'.replace(re89, '') + 'Ubebfxbc\x0a'.replace(re90, '') + 'Xvab\x0a'.replace(re89, '') + 'Xvab\x0a'.replace(re90, '') + 'Zbqhyrf'.replace(re2, '') + 'Zhfvx\x0a'.replace(re89, '') + 'Zhfvx\x0a'.replace(re90, '') + 'Anpuevpugra\x0a'.replace(re89, '') + 'Anpuevpugra\x0a'.replace(re90, '') + 'Cuk'.replace(re2, '') + 'ErdhrfgSvavfu'.split(re70) + 'ErdhrfgSvavfu.NWNK.Cuk'.split(re70) + 'Ebhgr\x0a'.replace(re89, '') + 'Ebhgr\x0a'.replace(re90, '') + str78.split(re32) + str79.split(re32) + str80.split(re32) + str81.split(re32) + 'Fcbeg\x0a'.replace(re89, '') + 'Fcbeg\x0a'.replace(re90, '') + 'GI-Fcbg\x0a'.replace(re89, '') + 'GI-Fcbg\x0a'.replace(re90, '') + 'Gbhe\x0a'.replace(re89, '') + 'Gbhe\x0a'.replace(re90, '') + 'Hagreunyghat\x0a'.replace(re89, '') + 'Hagreunyghat\x0a'.replace(re90, '') + 'Ivqrb\x0a'.replace(re89, '') + 'Ivqrb\x0a'.replace(re90, '') + 'Jrggre\x0a'.replace(re89, '') + 'Jrggre\x0a'.replace(re90, '') + str82.replace(re68, '') + str82.replace(re18, '') + str83.replace(re68, '') + str83.replace(re18, '') + str84.replace(re68, '') + str84.replace(re18, '') + 'nqiFreivprObk'.replace(re30, '') + 'nqiFubccvatObk'.replace(re30, '') + 'nwnk'.replace(re39, '') + 'nxghryy'.replace(re40, '') + 'nxghryy'.replace(re41, '') + 'nxghryy'.replace(re42, '') + 'nxghryy'.replace(re43, '') + 'nxghryy'.replace(re44, '') + 'nxghryy'.replace(re45, '') + 'nxghryy'.replace(re46, '') + 'nxghryy'.replace(re47, '') + 'nxghryy'.replace(re48, '') + str85.replace(re40, '') + str85.replace(re41, '') + str85.replace(re42, '') + str85.replace(re43, '') + str85.replace(re44, '') + str85.replace(re45, '') + str85.replace(re46, '') + str85.replace(re47, '') + str85.replace(re48, '') + 'pngrtbel'.replace(re29, '') + 'pngrtbel'.replace(re30, '') + 'pybfr'.replace(re39, '') + 'qvi'.replace(re39, '') + str86.replace(re68, '') + str86.replace(re18, '') + 'qg'.replace(re39, '') + 'qg'.replace(re68, '') + 'qg'.replace(re18, '') + 'rzorq'.replace(re39, '') + 'rzorq'.replace(re68, '') + 'rzorq'.replace(re18, '') + 'svryqOga'.replace(re39, '') + 'svryqOgaPnapry'.replace(re39, '') + 'svz_zlfcnpr_nccf-pnainf,svz_zlfcnpr_havgrq-fgngrf'.split(re20) + 'svanamra'.replace(re40, '') + 'svanamra'.replace(re41, '') + 'svanamra'.replace(re42, '') + 'svanamra'.replace(re43, '') + 'svanamra'.replace(re44, '') + 'svanamra'.replace(re45, '') + 'svanamra'.replace(re46, '') + 'svanamra'.replace(re47, '') + 'svanamra'.replace(re48, '') + 'sbphf'.split(re70) + 'sbphf.gno sbphfva.gno'.split(re70) + 'sbphfva'.split(re70) + 'sbez'.replace(re39, '') + 'sbez.nwnk'.replace(re68, '') + 'sbez.nwnk'.replace(re18, '') + 'tnzrf'.replace(re40, '') + 'tnzrf'.replace(re41, '') + 'tnzrf'.replace(re42, '') + 'tnzrf'.replace(re43, '') + 'tnzrf'.replace(re44, '') + 'tnzrf'.replace(re45, '') + 'tnzrf'.replace(re46, '') + 'tnzrf'.replace(re47, '') + 'tnzrf'.replace(re48, '') + 'ubzrcntr'.replace(re30, '') + 'ubebfxbc'.replace(re40, '') + 'ubebfxbc'.replace(re41, '') + 'ubebfxbc'.replace(re42, '') + 'ubebfxbc'.replace(re43, '') + 'ubebfxbc'.replace(re44, '') + 'ubebfxbc'.replace(re45, '') + 'ubebfxbc'.replace(re46, '') + 'ubebfxbc'.replace(re47, '') + 'ubebfxbc'.replace(re48, '') + 'uc_cebzbobk_ugzy%2Puc_cebzbobk_vzt'.replace(re30, '') + 'uc_erpgnatyr'.replace(re30, '') + str87.replace(re33, '') + str88.replace(re33, '') + 'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/onfr.wf${4}${5}'.replace( + re71, + '' + ) + 'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/onfr.wf${5}'.replace( + re72, + '' + ) + 'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/qlaYvo.wf${4}${5}'.replace( + re71, + '' + ) + 'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/qlaYvo.wf${5}'.replace( + re72, + '' + ) + 'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/rssrpgYvo.wf${4}${5}'.replace( + re71, + '' + ) + 'uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/rssrpgYvo.wf${5}'.replace( + re72, + '' + ) + str89.replace(re73, '') + 'uggc://zfacbegny.112.2b7.arg/o/ff/zfacbegnyubzr/1/U.7-cqi-2/f55023338617756?[NDO]&{1}&{2}&[NDR]'.replace( + re69, + '' + ) + str6.replace(re23, '') + 'xvab'.replace(re40, '') + 'xvab'.replace(re41, '') + 'xvab'.replace(re42, '') + 'xvab'.replace(re43, '') + 'xvab'.replace(re44, '') + 'xvab'.replace(re45, '') + 'xvab'.replace(re46, '') + 'xvab'.replace(re47, '') + 'xvab'.replace(re48, '') + 'ybnq'.split(re70) + 'zrqvnzbqgno lhv-anifrg lhv-anifrg-gbc'.replace(re18, '') + 'zrgn'.replace(re39, '') + str90.replace(re68, '') + str90.replace(re18, '') + 'zbhfrzbir'.split(re70) + 'zbhfrzbir.gno'.split(re70) + str63.replace(/^.*jroxvg\/(\d+(\.\d+)?).*$/, '') + 'zhfvx'.replace(re40, '') + 'zhfvx'.replace(re41, '') + 'zhfvx'.replace(re42, '') + 'zhfvx'.replace(re43, '') + 'zhfvx'.replace(re44, '') + 'zhfvx'.replace(re45, '') + 'zhfvx'.replace(re46, '') + 'zhfvx'.replace(re47, '') + 'zhfvx'.replace(re48, '') + 'zlfcnpr_nccf_pnainf'.replace(re52, '') + str91.replace(re40, '') + str91.replace(re41, '') + str91.replace(re42, '') + str91.replace(re43, '') + str91.replace(re44, '') + str91.replace(re45, '') + str91.replace(re46, '') + str91.replace(re47, '') + str91.replace(re48, '') + 'anzr'.replace(re39, '') + str92.replace(/\b\w+\b/g, '') + 'bow-nppbeqvba'.replace(re39, '') + 'bowrpg'.replace(re39, '') + 'bowrpg'.replace(re68, '') + 'bowrpg'.replace(re18, '') + 'cnenzf%2Rfglyrf'.replace(re29, '') + 'cnenzf%2Rfglyrf'.replace(re30, '') + 'cbchc'.replace(re30, '') + 'ebhgr'.replace(re40, '') + 'ebhgr'.replace(re41, '') + 'ebhgr'.replace(re42, '') + 'ebhgr'.replace(re43, '') + 'ebhgr'.replace(re44, '') + 'ebhgr'.replace(re45, '') + 'ebhgr'.replace(re46, '') + 'ebhgr'.replace(re47, '') + 'ebhgr'.replace(re48, '') + 'freivprobk_uc'.replace(re30, '') + 'fubccvatobk_uc'.replace(re30, '') + 'fubhgobk'.replace(re39, '') + 'fcbeg'.replace(re40, '') + 'fcbeg'.replace(re41, '') + 'fcbeg'.replace(re42, '') + 'fcbeg'.replace(re43, '') + 'fcbeg'.replace(re44, '') + 'fcbeg'.replace(re45, '') + 'fcbeg'.replace(re46, '') + 'fcbeg'.replace(re47, '') + 'fcbeg'.replace(re48, '') + 'gbhe'.replace(re40, '') + 'gbhe'.replace(re41, '') + 'gbhe'.replace(re42, '') + 'gbhe'.replace(re43, '') + 'gbhe'.replace(re44, '') + 'gbhe'.replace(re45, '') + 'gbhe'.replace(re46, '') + 'gbhe'.replace(re47, '') + 'gbhe'.replace(re48, '') + 'gi-fcbg'.replace(re40, '') + 'gi-fcbg'.replace(re41, '') + 'gi-fcbg'.replace(re42, '') + 'gi-fcbg'.replace(re43, '') + 'gi-fcbg'.replace(re44, '') + 'gi-fcbg'.replace(re45, '') + 'gi-fcbg'.replace(re46, '') + 'gi-fcbg'.replace(re47, '') + 'gi-fcbg'.replace(re48, '') + 'glcr'.replace(re39, '') + 'haqrsvarq'.replace(/\//g, '') + str93.replace(re40, '') + str93.replace(re41, '') + str93.replace(re42, '') + str93.replace(re43, '') + str93.replace(re44, '') + str93.replace(re45, '') + str93.replace(re46, '') + str93.replace(re47, '') + str93.replace(re48, '') + 'ivqrb'.replace(re40, '') + 'ivqrb'.replace(re41, '') + 'ivqrb'.replace(re42, '') + 'ivqrb'.replace(re43, '') + 'ivqrb'.replace(re44, '') + 'ivqrb'.replace(re45, '') + 'ivqrb'.replace(re46, '') + 'ivqrb'.replace(re47, '') + 'ivqrb'.replace(re48, '') + 'ivfvgf=1'.split(re86) + 'jrggre'.replace(re40, '') + 'jrggre'.replace(re41, '') + 'jrggre'.replace(re42, '') + 'jrggre'.replace(re43, '') + 'jrggre'.replace(re44, '') + 'jrggre'.replace(re45, '') + 'jrggre'.replace(re46, '') + 'jrggre'.replace(re47, '') + 'jrggre'.replace(re48, '') + ;/#[a-z0-9]+$/i.exec('uggc://jjj.fpuhryreim.arg/Qrsnhyg') + re66.exec('fryrpgrq') + ;/(?:^|\s+)lhv-ani(?:\s+|$)/.exec('sff lhv-ani') + ;/(?:^|\s+)lhv-anifrg(?:\s+|$)/.exec('zrqvnzbqgno lhv-anifrg') + ;/(?:^|\s+)lhv-anifrg-gbc(?:\s+|$)/.exec('zrqvnzbqgno lhv-anifrg') + re91.exec('GnoThvq') + re91.exec('thvq') + ;/(pbzcngvoyr|jroxvg)/.exec(str63) + ;/.+(?:ei|vg|en|vr)[\/: ]([\d.]+)/.exec(str63) + re8.exec('144631658.0.10.1231365869') + re8.exec('144631658.0.10.1231367054') + re8.exec( + '144631658.1231365869.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec( + '144631658.1231367054.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec( + '144631658.1670816052019209000.1231365869.1231365869.1231365869.1' + ) + re8.exec( + '144631658.1796080716621419500.1231367054.1231367054.1231367054.1' + ) + re8.exec(str94) + re8.exec(str95) + re8.exec(str96) + re8.exec(str97) + re8.exec( + '__hgzn=144631658.1670816052019209000.1231365869.1231365869.1231365869.1' + ) + re8.exec( + '__hgzn=144631658.1796080716621419500.1231367054.1231367054.1231367054.1' + ) + re8.exec('__hgzo=144631658.0.10.1231365869') + re8.exec('__hgzo=144631658.0.10.1231367054') + re8.exec( + '__hgzm=144631658.1231365869.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re8.exec( + '__hgzm=144631658.1231367054.1.1.hgzpfe=(qverpg)|hgzppa=(qverpg)|hgzpzq=(abar)' + ) + re34.exec(str78) + re34.exec(str79) + re34.exec(str81) + re74.exec(str77) + re74.exec('*') + re74.exec(str82) + re74.exec(str83) + re74.exec(str86) + re74.exec('rzorq') + re74.exec('sbez.nwnk') + re74.exec(str90) + re74.exec('bowrpg') + ;/\/onfr.wf(\?.+)?$/.exec( + '/uggc://wf.hv-cbegny.qr/tzk/ubzr/wf/20080602/onfr.wf' + ) + re28.exec('uvag ynfgUvag ynfg') + re75.exec('') + re76.exec('') + re77.exec('') + re78.exec('') + re80.exec(str77) + re80.exec('*') + re80.exec('.pybfr') + re80.exec(str82) + re80.exec(str83) + re80.exec(str84) + re80.exec(str86) + re80.exec('qg') + re80.exec('rzorq') + re80.exec('sbez.nwnk') + re80.exec(str90) + re80.exec('bowrpg') + re61.exec('qlaYvo.wf') + re61.exec('rssrpgYvo.wf') + re61.exec('uggc://jjj.tzk.arg/qr/?fgnghf=uvajrvf') + re92.exec(' .pybfr') + re92.exec(' n.svryqOgaPnapry') + re92.exec(' qg') + re92.exec(str48) + re92.exec('.nwnk') + re92.exec('.svryqOga,n.svryqOgaPnapry') + re92.exec('.svryqOgaPnapry') + re92.exec('.bow-nppbeqvba qg') + re68.exec(str77) + re68.exec('*') + re68.exec('.pybfr') + re68.exec(str82) + re68.exec(str83) + re68.exec(str84) + re68.exec(str86) + re68.exec('qg') + re68.exec('rzorq') + re68.exec('sbez.nwnk') + re68.exec(str90) + re68.exec('bowrpg') + re93.exec(' .pybfr') + re93.exec(' n.svryqOgaPnapry') + re93.exec(' qg') + re93.exec(str48) + re93.exec('.nwnk') + re93.exec('.svryqOga,n.svryqOgaPnapry') + re93.exec('.svryqOgaPnapry') + re93.exec('.bow-nppbeqvba qg') + re81.exec(str77) + re81.exec('*') + re81.exec(str48) + re81.exec('.pybfr') + re81.exec(str82) + re81.exec(str83) + re81.exec(str84) + re81.exec(str86) + re81.exec('qg') + re81.exec('rzorq') + re81.exec('sbez.nwnk') + re81.exec(str90) + re81.exec('bowrpg') + re94.exec(' .pybfr') + re94.exec(' n.svryqOgaPnapry') + re94.exec(' qg') + re94.exec(str48) + re94.exec('.nwnk') + re94.exec('.svryqOga,n.svryqOgaPnapry') + re94.exec('.svryqOgaPnapry') + re94.exec('.bow-nppbeqvba qg') + re94.exec('[anzr=nwnkHey]') + re94.exec(str82) + re31.exec('rf') + re31.exec('wn') + re82.exec(str77) + re82.exec('*') + re82.exec(str48) + re82.exec('.pybfr') + re82.exec(str82) + re82.exec(str83) + re82.exec(str84) + re82.exec(str86) + re82.exec('qg') + re82.exec('rzorq') + re82.exec('sbez.nwnk') + re82.exec(str90) + re82.exec('bowrpg') + re83.exec(str98) + re83.exec('shapgvba sbphf() { [angvir pbqr] }') + re62.exec('#Ybtva') + re62.exec('#Ybtva_cnffjbeq') + re62.exec(str77) + re62.exec('#fubhgobkWf') + re62.exec('#fubhgobkWfReebe') + re62.exec('#fubhgobkWfFhpprff') + re62.exec('*') + re62.exec(str82) + re62.exec(str83) + re62.exec(str86) + re62.exec('rzorq') + re62.exec('sbez.nwnk') + re62.exec(str90) + re62.exec('bowrpg') + re49.exec('pbagrag') + re24.exec(str6) + ;/xbadhrebe/.exec(str63) + ;/znp/.exec('jva32') + ;/zbmvyyn/.exec(str63) + ;/zfvr/.exec(str63) + ;/ag\s5\.1/.exec(str63) + ;/bcren/.exec(str63) + ;/fnsnev/.exec(str63) + ;/jva/.exec('jva32') + ;/jvaqbjf/.exec(str63) + } + } + + function run() { + for (var i = 0; i < 5; i++) { + runBlock0() + runBlock1() + runBlock2() + runBlock3() + runBlock4() + runBlock5() + runBlock6() + runBlock7() + runBlock8() + runBlock9() + runBlock10() + runBlock11() + } + } + + this.run = run +} +// Copyright 2009 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This benchmark is based on a JavaScript log processing module used +// by the V8 profiler to generate execution time profiles for runs of +// JavaScript applications, and it effectively measures how fast the +// JavaScript engine is at allocating nodes and reclaiming the memory +// used for old nodes. Because of the way splay trees work, the engine +// also has to deal with a lot of changes to the large tree object +// graph. + +// Configuration. +var kSplayTreeSize = 8000 +var kSplayTreeModifications = 80 +var kSplayTreePayloadDepth = 5 + +var splayTree = null + +function GeneratePayloadTree(depth, tag) { + if (depth == 0) { + return { + array: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + string: 'String for key ' + tag + ' in leaf node', + } + } else { + return { + left: GeneratePayloadTree(depth - 1, tag), + right: GeneratePayloadTree(depth - 1, tag), + } + } +} + +function GenerateKey() { + // The benchmark framework guarantees that Math.random is + // deterministic; see base.js. + return Math.random() +} + +function InsertNewNode() { + // Insert new node with a unique key. + var key + do { + key = GenerateKey() + } while (splayTree.find(key) != null) + var payload = GeneratePayloadTree(kSplayTreePayloadDepth, String(key)) + splayTree.insert(key, payload) + return key +} + +function SplaySetup() { + splayTree = new SplayTree() + for (var i = 0; i < kSplayTreeSize; i++) InsertNewNode() +} + +function SplayTearDown() { + // Allow the garbage collector to reclaim the memory + // used by the splay tree no matter how we exit the + // tear down function. + var keys = splayTree.exportKeys() + splayTree = null + + // Verify that the splay tree has the right size. + var length = keys.length + if (length != kSplayTreeSize) { + throw new Error('Splay tree has wrong size') + } + + // Verify that the splay tree has sorted, unique keys. + for (var i = 0; i < length - 1; i++) { + if (keys[i] >= keys[i + 1]) { + throw new Error('Splay tree not sorted') + } + } +} + +function SplayRun() { + // Replace a few nodes in the splay tree. + for (var i = 0; i < kSplayTreeModifications; i++) { + var key = InsertNewNode() + var greatest = splayTree.findGreatestLessThan(key) + if (greatest == null) splayTree.remove(key) + else splayTree.remove(greatest.key) + } +} + +/** + * Constructs a Splay tree. A splay tree is a self-balancing binary + * search tree with the additional property that recently accessed + * elements are quick to access again. It performs basic operations + * such as insertion, look-up and removal in O(log(n)) amortized time. + * + * @constructor + */ +function SplayTree() {} + +/** + * Pointer to the root node of the tree. + * + * @type {SplayTree.Node} + * @private + */ +SplayTree.prototype.root_ = null + +/** + * @return {boolean} Whether the tree is empty. + */ +SplayTree.prototype.isEmpty = function () { + return !this.root_ +} + +/** + * Inserts a node into the tree with the specified key and value if + * the tree does not already contain a node with the specified key. If + * the value is inserted, it becomes the root of the tree. + * + * @param {number} key Key to insert into the tree. + * @param {*} value Value to insert into the tree. + */ +SplayTree.prototype.insert = function (key, value) { + if (this.isEmpty()) { + this.root_ = new SplayTree.Node(key, value) + return + } + // Splay on the key to move the last node on the search path for + // the key to the root of the tree. + this.splay_(key) + if (this.root_.key == key) { + return + } + var node = new SplayTree.Node(key, value) + if (key > this.root_.key) { + node.left = this.root_ + node.right = this.root_.right + this.root_.right = null + } else { + node.right = this.root_ + node.left = this.root_.left + this.root_.left = null + } + this.root_ = node +} + +/** + * Removes a node with the specified key from the tree if the tree + * contains a node with this key. The removed node is returned. If the + * key is not found, an exception is thrown. + * + * @param {number} key Key to find and remove from the tree. + * @return {SplayTree.Node} The removed node. + */ +SplayTree.prototype.remove = function (key) { + if (this.isEmpty()) { + throw Error('Key not found: ' + key) + } + this.splay_(key) + if (this.root_.key != key) { + throw Error('Key not found: ' + key) + } + var removed = this.root_ + if (!this.root_.left) { + this.root_ = this.root_.right + } else { + var right = this.root_.right + this.root_ = this.root_.left + // Splay to make sure that the new root has an empty right child. + this.splay_(key) + // Insert the original right child as the right child of the new + // root. + this.root_.right = right + } + return removed +} + +/** + * Returns the node having the specified key or null if the tree doesn't contain + * a node with the specified key. + * + * @param {number} key Key to find in the tree. + * @return {SplayTree.Node} Node having the specified key. + */ +SplayTree.prototype.find = function (key) { + if (this.isEmpty()) { + return null + } + this.splay_(key) + return this.root_.key == key ? this.root_ : null +} + +/** + * @return {SplayTree.Node} Node having the maximum key value. + */ +SplayTree.prototype.findMax = function (opt_startNode) { + if (this.isEmpty()) { + return null + } + var current = opt_startNode || this.root_ + while (current.right) { + current = current.right + } + return current +} + +/** + * @return {SplayTree.Node} Node having the maximum key value that + * is less than the specified key value. + */ +SplayTree.prototype.findGreatestLessThan = function (key) { + if (this.isEmpty()) { + return null + } + // Splay on the key to move the node with the given key or the last + // node on the search path to the top of the tree. + this.splay_(key) + // Now the result is either the root node or the greatest node in + // the left subtree. + if (this.root_.key < key) { + return this.root_ + } else if (this.root_.left) { + return this.findMax(this.root_.left) + } else { + return null + } +} + +/** + * @return {Array<*>} An array containing all the keys of tree's nodes. + */ +SplayTree.prototype.exportKeys = function () { + var result = [] + if (!this.isEmpty()) { + this.root_.traverse_(function (node) { + result.push(node.key) + }) + } + return result +} + +/** + * Perform the splay operation for the given key. Moves the node with + * the given key to the top of the tree. If no node has the given + * key, the last node on the search path is moved to the top of the + * tree. This is the simplified top-down splaying algorithm from: + * "Self-adjusting Binary Search Trees" by Sleator and Tarjan + * + * @param {number} key Key to splay the tree on. + * @private + */ +SplayTree.prototype.splay_ = function (key) { + if (this.isEmpty()) { + return + } + // Create a dummy node. The use of the dummy node is a bit + // counter-intuitive: The right child of the dummy node will hold + // the L tree of the algorithm. The left child of the dummy node + // will hold the R tree of the algorithm. Using a dummy node, left + // and right will always be nodes and we avoid special cases. + var dummy, left, right + dummy = left = right = new SplayTree.Node(null, null) + var current = this.root_ + while (true) { + if (key < current.key) { + if (!current.left) { + break + } + if (key < current.left.key) { + // Rotate right. + var tmp = current.left + current.left = tmp.right + tmp.right = current + current = tmp + if (!current.left) { + break + } + } + // Link right. + right.left = current + right = current + current = current.left + } else if (key > current.key) { + if (!current.right) { + break + } + if (key > current.right.key) { + // Rotate left. + var tmp = current.right + current.right = tmp.left + tmp.left = current + current = tmp + if (!current.right) { + break + } + } + // Link left. + left.right = current + left = current + current = current.right + } else { + break + } + } + // Assemble. + left.right = current.left + right.left = current.right + current.left = dummy.right + current.right = dummy.left + this.root_ = current +} + +/** + * Constructs a Splay tree node. + * + * @param {number} key Key. + * @param {*} value Value. + */ +SplayTree.Node = function (key, value) { + this.key = key + this.value = value +} + +/** + * @type {SplayTree.Node} + */ +SplayTree.Node.prototype.left = null + +/** + * @type {SplayTree.Node} + */ +SplayTree.Node.prototype.right = null + +/** + * Performs an ordered traversal of the subtree starting at + * this SplayTree.Node. + * + * @param {function(SplayTree.Node)} f Visitor function. + * @private + */ +SplayTree.Node.prototype.traverse_ = function (f) { + var current = this + while (current) { + var left = current.left + if (left) left.traverse_(f) + f(current) + current = current.right + } +} + +var Splay = new BenchmarkSuite('Splay', 81491, [ + new Benchmark('Splay', SplayRun, SplaySetup, SplayTearDown), +]) +/** + * Copyright 2012 the V8 project authors. All rights reserved. + * Copyright 2009 Oliver Hunt + * + * 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. + */ + +var solver = null + +function runNavierStokes() { + solver.update() +} + +function setupNavierStokes() { + solver = new FluidField(null) + solver.setResolution(128, 128) + solver.setIterations(20) + solver.setDisplayFunction(function () {}) + solver.setUICallback(prepareFrame) + solver.reset() +} + +function tearDownNavierStokes() { + solver = null +} + +function addPoints(field) { + var n = 64 + for (var i = 1; i <= n; i++) { + field.setVelocity(i, i, n, n) + field.setDensity(i, i, 5) + field.setVelocity(i, n - i, -n, -n) + field.setDensity(i, n - i, 20) + field.setVelocity(128 - i, n + i, -n, -n) + field.setDensity(128 - i, n + i, 30) + } +} + +var framesTillAddingPoints = 0 +var framesBetweenAddingPoints = 5 + +function prepareFrame(field) { + if (framesTillAddingPoints == 0) { + addPoints(field) + framesTillAddingPoints = framesBetweenAddingPoints + framesBetweenAddingPoints++ + } else { + framesTillAddingPoints-- + } +} + +// Code from Oliver Hunt (http://nerget.com/fluidSim/pressure.js) starts here. +function FluidField(canvas) { + function addFields(x, s, dt) { + for (var i = 0; i < size; i++) x[i] += dt * s[i] + } + + function set_bnd(b, x) { + if (b === 1) { + for (var i = 1; i <= width; i++) { + x[i] = x[i + rowSize] + x[i + (height + 1) * rowSize] = x[i + height * rowSize] + } + + for (var j = 1; i <= height; i++) { + x[j * rowSize] = -x[1 + j * rowSize] + x[width + 1 + j * rowSize] = -x[width + j * rowSize] + } + } else if (b === 2) { + for (var i = 1; i <= width; i++) { + x[i] = -x[i + rowSize] + x[i + (height + 1) * rowSize] = -x[i + height * rowSize] + } + + for (var j = 1; j <= height; j++) { + x[j * rowSize] = x[1 + j * rowSize] + x[width + 1 + j * rowSize] = x[width + j * rowSize] + } + } else { + for (var i = 1; i <= width; i++) { + x[i] = x[i + rowSize] + x[i + (height + 1) * rowSize] = x[i + height * rowSize] + } + + for (var j = 1; j <= height; j++) { + x[j * rowSize] = x[1 + j * rowSize] + x[width + 1 + j * rowSize] = x[width + j * rowSize] + } + } + var maxEdge = (height + 1) * rowSize + x[0] = 0.5 * (x[1] + x[rowSize]) + x[maxEdge] = 0.5 * (x[1 + maxEdge] + x[height * rowSize]) + x[width + 1] = 0.5 * (x[width] + x[width + 1 + rowSize]) + x[width + 1 + maxEdge] = + 0.5 * (x[width + maxEdge] + x[width + 1 + height * rowSize]) + } + + function lin_solve(b, x, x0, a, c) { + if (a === 0 && c === 1) { + for (var j = 1; j <= height; j++) { + var currentRow = j * rowSize + ++currentRow + for (var i = 0; i < width; i++) { + x[currentRow] = x0[currentRow] + ++currentRow + } + } + set_bnd(b, x) + } else { + var invC = 1 / c + for (var k = 0; k < iterations; k++) { + for (var j = 1; j <= height; j++) { + var lastRow = (j - 1) * rowSize + var currentRow = j * rowSize + var nextRow = (j + 1) * rowSize + var lastX = x[currentRow] + ++currentRow + for (var i = 1; i <= width; i++) + lastX = x[currentRow] = + (x0[currentRow] + + a * (lastX + x[++currentRow] + x[++lastRow] + x[++nextRow])) * + invC + } + set_bnd(b, x) + } + } + } + + function diffuse(b, x, x0, dt) { + var a = 0 + lin_solve(b, x, x0, a, 1 + 4 * a) + } + + function lin_solve2(x, x0, y, y0, a, c) { + if (a === 0 && c === 1) { + for (var j = 1; j <= height; j++) { + var currentRow = j * rowSize + ++currentRow + for (var i = 0; i < width; i++) { + x[currentRow] = x0[currentRow] + y[currentRow] = y0[currentRow] + ++currentRow + } + } + set_bnd(1, x) + set_bnd(2, y) + } else { + var invC = 1 / c + for (var k = 0; k < iterations; k++) { + for (var j = 1; j <= height; j++) { + var lastRow = (j - 1) * rowSize + var currentRow = j * rowSize + var nextRow = (j + 1) * rowSize + var lastX = x[currentRow] + var lastY = y[currentRow] + ++currentRow + for (var i = 1; i <= width; i++) { + lastX = x[currentRow] = + (x0[currentRow] + + a * (lastX + x[currentRow] + x[lastRow] + x[nextRow])) * + invC + lastY = y[currentRow] = + (y0[currentRow] + + a * (lastY + y[++currentRow] + y[++lastRow] + y[++nextRow])) * + invC + } + } + set_bnd(1, x) + set_bnd(2, y) + } + } + } + + function diffuse2(x, x0, y, y0, dt) { + var a = 0 + lin_solve2(x, x0, y, y0, a, 1 + 4 * a) + } + + function advect(b, d, d0, u, v, dt) { + var Wdt0 = dt * width + var Hdt0 = dt * height + var Wp5 = width + 0.5 + var Hp5 = height + 0.5 + for (var j = 1; j <= height; j++) { + var pos = j * rowSize + for (var i = 1; i <= width; i++) { + var x = i - Wdt0 * u[++pos] + var y = j - Hdt0 * v[pos] + if (x < 0.5) x = 0.5 + else if (x > Wp5) x = Wp5 + var i0 = x | 0 + var i1 = i0 + 1 + if (y < 0.5) y = 0.5 + else if (y > Hp5) y = Hp5 + var j0 = y | 0 + var j1 = j0 + 1 + var s1 = x - i0 + var s0 = 1 - s1 + var t1 = y - j0 + var t0 = 1 - t1 + var row1 = j0 * rowSize + var row2 = j1 * rowSize + d[pos] = + s0 * (t0 * d0[i0 + row1] + t1 * d0[i0 + row2]) + + s1 * (t0 * d0[i1 + row1] + t1 * d0[i1 + row2]) + } + } + set_bnd(b, d) + } + + function project(u, v, p, div) { + var h = -0.5 / Math.sqrt(width * height) + for (var j = 1; j <= height; j++) { + var row = j * rowSize + var previousRow = (j - 1) * rowSize + var prevValue = row - 1 + var currentRow = row + var nextValue = row + 1 + var nextRow = (j + 1) * rowSize + for (var i = 1; i <= width; i++) { + div[++currentRow] = + h * + (u[++nextValue] - u[++prevValue] + v[++nextRow] - v[++previousRow]) + p[currentRow] = 0 + } + } + set_bnd(0, div) + set_bnd(0, p) + + lin_solve(0, p, div, 1, 4) + var wScale = 0.5 * width + var hScale = 0.5 * height + for (var j = 1; j <= height; j++) { + var prevPos = j * rowSize - 1 + var currentPos = j * rowSize + var nextPos = j * rowSize + 1 + var prevRow = (j - 1) * rowSize + var currentRow = j * rowSize + var nextRow = (j + 1) * rowSize + + for (var i = 1; i <= width; i++) { + u[++currentPos] -= wScale * (p[++nextPos] - p[++prevPos]) + v[currentPos] -= hScale * (p[++nextRow] - p[++prevRow]) + } + } + set_bnd(1, u) + set_bnd(2, v) + } + + function dens_step(x, x0, u, v, dt) { + addFields(x, x0, dt) + diffuse(0, x0, x, dt) + advect(0, x, x0, u, v, dt) + } + + function vel_step(u, v, u0, v0, dt) { + addFields(u, u0, dt) + addFields(v, v0, dt) + var temp = u0 + u0 = u + u = temp + var temp = v0 + v0 = v + v = temp + diffuse2(u, u0, v, v0, dt) + project(u, v, u0, v0) + var temp = u0 + u0 = u + u = temp + var temp = v0 + v0 = v + v = temp + advect(1, u, u0, u0, v0, dt) + advect(2, v, v0, u0, v0, dt) + project(u, v, u0, v0) + } + var uiCallback = function (d, u, v) {} + + function Field(dens, u, v) { + // Just exposing the fields here rather than using accessors is a measurable win during display (maybe 5%) + // but makes the code ugly. + this.setDensity = function (x, y, d) { + dens[x + 1 + (y + 1) * rowSize] = d + } + this.getDensity = function (x, y) { + return dens[x + 1 + (y + 1) * rowSize] + } + this.setVelocity = function (x, y, xv, yv) { + u[x + 1 + (y + 1) * rowSize] = xv + v[x + 1 + (y + 1) * rowSize] = yv + } + this.getXVelocity = function (x, y) { + return u[x + 1 + (y + 1) * rowSize] + } + this.getYVelocity = function (x, y) { + return v[x + 1 + (y + 1) * rowSize] + } + this.width = function () { + return width + } + this.height = function () { + return height + } + } + function queryUI(d, u, v) { + for (var i = 0; i < size; i++) u[i] = v[i] = d[i] = 0.0 + uiCallback(new Field(d, u, v)) + } + + this.update = function () { + queryUI(dens_prev, u_prev, v_prev) + vel_step(u, v, u_prev, v_prev, dt) + dens_step(dens, dens_prev, u, v, dt) + displayFunc(new Field(dens, u, v)) + } + this.setDisplayFunction = function (func) { + displayFunc = func + } + + this.iterations = function () { + return iterations + } + this.setIterations = function (iters) { + if (iters > 0 && iters <= 100) iterations = iters + } + this.setUICallback = function (callback) { + uiCallback = callback + } + var iterations = 10 + var visc = 0.5 + var dt = 0.1 + var dens + var dens_prev + var u + var u_prev + var v + var v_prev + var width + var height + var rowSize + var size + var displayFunc + function reset() { + rowSize = width + 2 + size = (width + 2) * (height + 2) + dens = new Array(size) + dens_prev = new Array(size) + u = new Array(size) + u_prev = new Array(size) + v = new Array(size) + v_prev = new Array(size) + for (var i = 0; i < size; i++) + dens_prev[i] = u_prev[i] = v_prev[i] = dens[i] = u[i] = v[i] = 0 + } + this.reset = reset + this.setResolution = function (hRes, wRes) { + var res = wRes * hRes + if (res > 0 && res < 1000000 && (wRes != width || hRes != height)) { + width = wRes + height = hRes + reset() + return true + } + return false + } + this.setResolution(64, 64) +} + +var NavierStokes = new BenchmarkSuite('NavierStokes', 1484000, [ + new Benchmark( + 'NavierStokes', + runNavierStokes, + setupNavierStokes, + tearDownNavierStokes + ), +]) + +/* run_harness.js */ +if (globalThis.print === undefined) { + globalThis.print = console.log +} + +function Run() { + BenchmarkSuite.RunSuites({ + NotifyStep: ShowProgress, + NotifyError: AddError, + NotifyResult: AddResult, + NotifyScore: AddScore, + }) +} + +var harnessErrorCount = 0 + +function ShowProgress(name) { + console.log('PROGRESS', name) +} + +function AddError(name, error) { + console.log('ERROR', name, error) + console.log(error.stack) + harnessErrorCount++ +} + +let bench_result = [] +function AddResult(name, result) { + console.log('RESULT', name, result) + bench_result.push({ name, result }) +} + +function AddScore(score) { + console.log('SCORE', score) + bench_result.push({ name: 'Score', result: score }) +} + +function runBenchmark() { + try { + bench_result = [] + Run() + const result = `Benchmark Result: ${bench_result.map((i) => `${i.name}: ${i.result}`).join(",")}`; + console.log(result) + return result; + } catch (e) { + console.log('*** Run() failed') + console.log(e.stack || e) + } + + if (harnessErrorCount > 0) { + // Throw an error so that 'duk' has a non-zero exit code which helps + // automatic testing. + throw new Error('Benchmark had ' + harnessErrorCount + ' errors') + } +} + +exports.runBenchmark = runBenchmark; + diff --git a/test-app/app/src/main/assets/internal/ts_helpers.js b/test-app/app/src/main/assets/internal/ts_helpers.js index 3b3a22e1..8ad7bbc7 100644 --- a/test-app/app/src/main/assets/internal/ts_helpers.js +++ b/test-app/app/src/main/assets/internal/ts_helpers.js @@ -338,8 +338,8 @@ const ret = `blob:nativescript/${id}`; BLOB_STORE.set(ret, { blob: object, - type: object?.type, - ext: options?.ext, + type: object ? object.type : undefined, + ext: options ? options.ext : undefined, }); return ret; } From f2a94bd34cc8ed9d1a718238756661002b8ec19a Mon Sep 17 00:00:00 2001 From: Ammar Ahmed Date: Sun, 2 Nov 2025 23:32:33 +0500 Subject: [PATCH 2/2] add setup command --- README.md | 7 ++++++- package.json | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 02138caf..4a2b4db0 100644 --- a/README.md +++ b/README.md @@ -74,11 +74,16 @@ Set the following environment variables: - `ANDROID_HOME` pointing to where you have installed the Android SDK - `ANDROID_NDK_HOME` pointing to the version of the Android NDK needed for this version of NativeScript -Run the following command to build the runtime: +Run the following commands to build the runtime: + +``` +npm run setup +``` ``` npm run build ``` + The command will let you interactively choose the JS engine you want to build with. i.e V8, QuickJS, Hermes or JSC, PrimJS, Static Hermes. - The build process includes building of the runtime package (both optimized and with unstripped v8 symbol table), as well as all supplementary tools used for the android builds: metadata-generator, binding-generator, metadata-generator, static-binding-generator diff --git a/package.json b/package.json index ca93d960..fe10844e 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "scripts": { "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", "version": "npm run changelog && git add CHANGELOG.md", - "build": "node ./scripts/build.js" + "build": "node ./scripts/build.js", + "setup": "cd test-app/build-tools/jsparser && npm install && cd ../../../" }, "devDependencies": { "conventional-changelog-cli": "^2.1.1",