1.0.996 • Published 2 days ago

mol_wire_pub v1.0.996

Weekly downloads
-
License
-
Repository
-
Last release
2 days ago

$mol_wire

A reactivity system. It gives ability to:

  • Make any state observable using only 1.5KB lib. $hyoo_crowd as example.
  • Automatic dynamic track runtime value dependencies and optimize task execution order.
  • Memoize calculations with automatic revalidation. Yes, it completely solves the first of hard problem in computer science.
  • Convert sync API to async and vice versa. Yes, it's a black magic of idempotence.
  • Manage resources automatically with predictable deconstruction moment. Yes, we don't rely on garbage collector.
  • Dramatically reduce source code size and increase reliability by implementing reactive architecture.

Articles about

High level API

Decorators

Proxies

Functions

Structures

Low level API

Debug

Pub/Sub

Reactivity

NPM Bundles

mol_wire_lib

Lib with all production ready $mol_wire modules.

npm install mol_wire_lib

7KB npm.io

TypeScript example:

import {
	$mol_wire_solo as solo,
	$mol_wire_plex as plex,
	$mol_wire_method as task,
} from 'mol_wire_lib'

class User {
	@solo age( next = 0 ) { return next }
	@plex finger_exists( id: string, next = true ) { return next }
	@task finger_cut( id: string ) { this.finger_exists( id, false ) }
}

JavaScript example:

const $ = require( 'mol_wire_lib' )

class User {
	age( next = 0 ) { return next }
	finger_exists( id: string, next = true ) { return next }
	finger_cut( id: string ) { this.finger_exists( id, false ) }
}

$.$mol_wire_solo( User.prototype, 'age' )
$.$mol_wire_plex( User.prototype, 'finger_exists' )
$.$mol_wire_task( User.prototype, 'finger_cut' )

mol_wire_pub

Tiny lib to making any state observabe for other $mol_wire based libs.

npm install mol_wire_pub

1.5KB npm.io

import { $mol_wire_pub as Publisher } from 'mol_wire_pub'

let counter = 0
const pub = new Publisher

export function state() {
	pub.promote()
	return counter
}

export function increase() {
	++ counter
	pub.emit()
}

export function decrease() {
	-- counter
	pub.emit()
}

mol_wire_dom

Lib to make real DOM reactive.

npm install mol_wire_domm

7.5KB npm.io

import { $mol_wire_dom as reactivate } from 'mol_wire_dom'

reactivate( document.body )

Close alternatives

Architectural comparison

Core concepts

In $mol_wire we build reactive systems using classes that have reactive properties. We represent a reactive property using a class method with an appropriate decorator.

Channels

We define properties in accordance to the pattern of channels. A channel behaves like a getter when called without arguments and as a getter-setter otherwise. This approach proves to be more flexible than others.

Here's an example of a simple channel:

let _title = ''
const title = ( text = _title )=> _title = text

title()                  // getter, returns ''
title( 'Buy some milk' ) // getter-setter, sets and returns 'Buy some milk'
title()                  // getter, returns 'Buy some milk'

You can notice that this is similar to some JQuery methods.

Instead of a plain function and a variable $mol_wire uses class methods with an appropriate decorator:

import { $mol_wire_solo as solo } from 'mol_wire_lib'

class Store {
	@solo title( text = '' ) { return text }
}

const store = new Store()

store.title()                  // getter, returns ''
store.title( 'Buy some milk' ) // getter-setter, sets and returns 'Buy some milk'
store.title()                  // getter, returns 'Buy some milk'

The decorator memoizes what's been returned from the method so when someone uses it as a getter the method itself is not called and instead the memoized value is returned.

Properties either:

  • store values
  • or compute new values based on other properties.

The computed properties will only recompute when one of their dependencies change.

import { $mol_wire_solo as solo } from 'mol_wire_lib'

class User {
	// stores a value
	@solo name_first( next = 'Thomas' ) {
		return next
	}

	// stores a value
	@solo name_last( next = 'Anderson' ) {
		return next
	}

	// computes a value based on other channels
	@solo name() {
		console.log('compute name')
		return `${this.name_first()} ${this.name_last()}`
	}
}

const user = new User()

console.log(user.name()) // logs: 'compute name', 'Thomas Anderson'
console.log(user.name()) // logs: 'Thomas Anderson'

// setter, marks 'name' as a subject to recomputation,
// but doesn't recompute immediately
user.name_last('William')

console.log(user.name()) // logs: 'compute name', 'Thomas William'
console.log(user.name()) // logs: 'Thomas William'

Memoization

Channels marked with a @solo or @plex decorator are memoized until a new value is set to them or one of their dependencies change.

We can use memoization to guarantee that a reference to an object will stay the same:

import { $mol_wire_solo as solo } from 'mol_wire_lib'

class Task {
	@solo timestamp( value = 0 ) {
		return value
	}

	// won't create new instances until `timestamp` is changed
	@solo moment() {
		return new Moment(this.timestamp())
	}
}

Or with memoization we can cache expensive computations:

import { $mol_wire_solo as solo } from 'mol_wire_lib'

class Task {
	@solo title( title = '' ) {
		return title
	}

	// won't recompute
	@solo segmenter() {
		return new Intl.Segmenter()
	}

	// won't recompute until `title` is changed
	@solo mirrored_title() {
		const segmenter = this.segmenter()
		const segments = [ ... segmenter.segment( this.title() ) ]
		return segments.map( s => s.segment ).reverse().join('')
	}
}

With $mol_wire_plex (as in multiplexing) we can store multiple values:

import { $mol_wire_plex as plex } from 'mol_wire_lib'

class Project {
	@plex task( id: number ) {
		return new Task( id )
	}
}

const project = new Project()
const task1 = project.task(1)
const task2 = project.task(2)

Hacking

Another piece of flexibility that channels give is what's called hacking. It allows us to impose custom rules on how channels are read or set:

import {
	$mol_wire_solo as solo,
	$mol_wire_plex as plex,
} from 'mol_wire_lib'

class Task {
	// task has a duration
	@solo duration( dur?: number ) {
		return dur
	}
}

class Project_limited {
	// project has many tasks
	@plex task( id: number ) {
		const task = new Task()

		// the "hacking" technique:
		// when someone tries to get or set the duration for a task
		// we proxy this through our own method imposing a limitation for maximum duration
		task.duration = ( duration ) => this.task_duration( id, duration )

		return task
	}

	@plex task_duration( id: number, duration = 1 ) {
		// clamp the duration to the maximum value
		return Math.min( duration, this.duration_max() )
	}

	duration_max() {
		return 10
	}
}

const project_limited = new Project_limited()

const task_limited = project_limited.task(1)
task_limited.duration(20) // try to set 20 for the duration

console.log(task_limited.duration()) // logs: 10

Destructors

We can take the use of memoization even further by leveraging destructors.

$mol_wire will call a special method named destructor on an object that is no longer needed:

import { $mol_wire_solo as solo } from 'mol_wire_lib'

class ExampleAPI {
	socket: WebSocket

	constructor (
		public api_key : string ,
	) {
		this.socket = new WebSocket(`wss://example.com?api_key=${api_key}`)
	}

	// the special method
	destructor() {
		this.socket.close()
	}
}

class App {
	@solo api_key( value = '' ) {
		return value
	}

	@solo api() {
		return new ExampleAPI( this.api_key() )
	}
}

const app = new App()

// set an api key
app.api_key('testkey1')

// create an instance of WebSocket, establish a connection
app.api()

// change the api key
// this will trigger creation of a new web socket
// and the old one will get destructured
app.api_key('testkey2')

Asynchronous computed values

Unlike many other reactivity systems, $mol_wire allows you to have computeds that depend on asynchronous values.

$mol_wire makes it possible by using an implementaion of Suspense API where an asynchronous task throws an exception to pause the computation until the task resolves. You can read more about it here.

import {
	$mol_wire_solo as solo,
	$mol_wire_sync,
	$mol_wire_async,
} from 'mol_wire_lib'

// produce a value with 1 second delay
function value_async(): Promise<number> {
	return new Promise((resolve) => {
		const value = 25
		setTimeout(() => resolve(value), 1000)
	})
}

class App {
	@solo value() {
		// convert asynchronous function to a synchronous one
		// NOTE closures won't work here,
		// NOTE only use references to pre-defined functions or object methods
		const value_sync = $mol_wire_sync(value_async)

		// treat the value as it is already there
		return value_sync() * 2
	}

	run() {
		console.log(this.value())
	}
}

const app = new App()

// run the application in a Suspense environment
$mol_wire_async(app).run()

// logs: 50

Side effects in asynchronous computations

In $mol_wire we treat values that are computed asynchronously as they're already there. This is thanks to Suspense API: when an asynchronous task starts in a method it throws an exception and when it finishes the method is called again. A more detailed description is here.

Because of that we have to be a little careful about how we make side effects inside our methods.

The @$mol_wire_method decorator (which is usually aliased to @action) prevents methods from being called multiple times:

import {
	$mol_wire_method as action,
	$mol_wire_sync,
} from 'mol_wire_lib'

class App {
	// Auto wrap method to task
	@action main() {
		// Convert async api to sync
		const syncFetch = $mol_wire_sync( fetch )

		this.log( 'Request' ) // 3 calls, 1 log
		const response = syncFetch( 'https://example.org' ) // Sync but non-blocking
		const syncResponse = $mol_wire_sync( response )

		this.log( 'Parse' ) // 2 calls, 1 log
		const response = syncResponse.json() // Sync but non-blocking

		this.log( 'Done' ) // 1 call, 1 log
	}

	// Auto wrap method to sub-task
	@action log( ... args: any[] ) {
		console.log( ... args )
		// No restarts within a portion of a task
	}
}

Cancelling asynchronous tasks

We can cancel asynchronous tasks when we no longer need them by using destructors again.

Here's an example of a cancelable fetch:

import { $mol_wire_sync } from 'mol_wire_lib'

const fetchJSON = $mol_wire_sync( function fetch_abortable(
	input: RequestInfo,
	init: RequestInit = {}
) {
	const controller = new AbortController
	init.signal ||= controller.signal

	const promise = fetch( input, init )
		.then( response => response.json() )

	// assign a destructor to cancel the request
	const destructor = ()=> controller.abort()
	return Object.assign( promise, { destructor } )
} )

Then, we can use it in our computeds:

import { $mol_wire_plex as plex } from 'mol_wire_lib'

class GitHub {
	@plex static issue( id: number ) {
		return fetchJSON( `https://api.github.com/repos/nin-jin/HabHub/issues/${id}` )
	}
}

or a more interesting use case could look like this:

import { $mol_wire_async } from 'mol_wire_lib'

button.onclick = $mol_wire_async( function() {
	const { profile } = fetchJSON( 'https://example.org/input' )
	console.log( profile )
} )

In the above example clicking the button will trigger an HTTP request. If it doesn't resolve until the user clicks again, a new request will be sent and the previous one will get cancelled.

And this is how easy it is to add debounce to this function:

button.onclick = $mol_wire_async( function() {
+	// schedule a timer
+	// the execution won't go past this point until it resolves
+	// if onclick is called again the timer gets rescheduled
+	$mol_wait_timeout( 1000 )
	const { profile } = fetchJSON( 'https://example.org/input' )
	console.log( profile )
} )
1.0.996

2 days ago

1.0.994

4 days ago

1.0.993

5 days ago

1.0.995

3 days ago

1.0.990

8 days ago

1.0.992

6 days ago

1.0.991

7 days ago

1.0.989

9 days ago

1.0.988

9 days ago

1.0.987

10 days ago

1.0.986

11 days ago

1.0.985

12 days ago

1.0.984

13 days ago

1.0.983

14 days ago

1.0.981

16 days ago

1.0.982

15 days ago

1.0.980

17 days ago

1.0.979

18 days ago

1.0.978

19 days ago

1.0.977

20 days ago

1.0.976

21 days ago

1.0.975

22 days ago

1.0.974

23 days ago

1.0.972

25 days ago

1.0.973

24 days ago

1.0.970

27 days ago

1.0.971

26 days ago

1.0.969

28 days ago

1.0.968

29 days ago

1.0.967

30 days ago

1.0.966

1 month ago

1.0.965

1 month ago

1.0.964

1 month ago

1.0.963

1 month ago

1.0.962

1 month ago

1.0.961

1 month ago

1.0.960

1 month ago

1.0.959

1 month ago

1.0.958

1 month ago

1.0.957

1 month ago

1.0.956

1 month ago

1.0.955

1 month ago

1.0.954

1 month ago

1.0.953

1 month ago

1.0.952

1 month ago

1.0.950

2 months ago

1.0.951

2 months ago

1.0.949

2 months ago

1.0.948

2 months ago

1.0.945

2 months ago

1.0.947

2 months ago

1.0.946

2 months ago

1.0.944

2 months ago

1.0.943

2 months ago

1.0.942

2 months ago

1.0.941

2 months ago

1.0.940

2 months ago

1.0.939

2 months ago

1.0.936

2 months ago

1.0.935

2 months ago

1.0.938

2 months ago

1.0.937

2 months ago

1.0.932

2 months ago

1.0.934

2 months ago

1.0.933

2 months ago

1.0.931

2 months ago

1.0.930

2 months ago

1.0.929

2 months ago

1.0.928

2 months ago

1.0.927

2 months ago

1.0.926

2 months ago

1.0.925

2 months ago

1.0.924

2 months ago

1.0.923

2 months ago

1.0.921

2 months ago

1.0.922

2 months ago

1.0.920

2 months ago

1.0.918

2 months ago

1.0.917

2 months ago

1.0.919

2 months ago

1.0.914

2 months ago

1.0.913

2 months ago

1.0.916

2 months ago

1.0.915

2 months ago

1.0.912

2 months ago

1.0.910

3 months ago

1.0.911

2 months ago

1.0.907

3 months ago

1.0.909

3 months ago

1.0.908

3 months ago

1.0.906

3 months ago

1.0.905

3 months ago

1.0.903

3 months ago

1.0.902

3 months ago

1.0.904

3 months ago

1.0.901

3 months ago

1.0.899

3 months ago

1.0.900

3 months ago

1.0.898

3 months ago

1.0.897

3 months ago

1.0.893

3 months ago

1.0.892

3 months ago

1.0.895

3 months ago

1.0.894

3 months ago

1.0.896

3 months ago

1.0.891

3 months ago

1.0.890

3 months ago

1.0.888

3 months ago

1.0.889

3 months ago

1.0.887

3 months ago

1.0.886

3 months ago

1.0.885

3 months ago

1.0.880

3 months ago

1.0.882

3 months ago

1.0.881

3 months ago

1.0.884

3 months ago

1.0.883

3 months ago

1.0.877

3 months ago

1.0.876

3 months ago

1.0.879

3 months ago

1.0.878

3 months ago

1.0.875

3 months ago

1.0.874

3 months ago

1.0.873

3 months ago

1.0.868

3 months ago

1.0.867

3 months ago

1.0.871

3 months ago

1.0.870

3 months ago

1.0.872

3 months ago

1.0.869

3 months ago

1.0.866

3 months ago

1.0.865

3 months ago

1.0.864

4 months ago

1.0.863

4 months ago

1.0.862

4 months ago

1.0.860

4 months ago

1.0.861

4 months ago

1.0.859

4 months ago

1.0.858

4 months ago

1.0.855

4 months ago

1.0.854

4 months ago

1.0.857

4 months ago

1.0.856

4 months ago

1.0.853

4 months ago

1.0.852

4 months ago

1.0.851

4 months ago

1.0.850

4 months ago

1.0.848

4 months ago

1.0.847

4 months ago

1.0.849

4 months ago

1.0.846

4 months ago

1.0.845

4 months ago

1.0.844

4 months ago

1.0.843

4 months ago

1.0.842

4 months ago

1.0.840

4 months ago

1.0.841

4 months ago

1.0.839

4 months ago

1.0.837

4 months ago

1.0.838

4 months ago

1.0.836

4 months ago

1.0.833

4 months ago

1.0.832

4 months ago

1.0.835

4 months ago

1.0.834

4 months ago

1.0.831

4 months ago

1.0.830

4 months ago

1.0.829

4 months ago

1.0.828

4 months ago

1.0.826

4 months ago

1.0.827

4 months ago

1.0.825

4 months ago

1.0.824

4 months ago

1.0.823

5 months ago

1.0.822

5 months ago

1.0.821

5 months ago

1.0.820

5 months ago

1.0.819

5 months ago

1.0.818

5 months ago

1.0.817

5 months ago

1.0.816

5 months ago

1.0.815

5 months ago

1.0.814

5 months ago

1.0.811

5 months ago

1.0.813

5 months ago

1.0.812

5 months ago

1.0.810

5 months ago

1.0.808

5 months ago

1.0.807

5 months ago

1.0.809

5 months ago

1.0.806

5 months ago

1.0.805

5 months ago

1.0.804

5 months ago

1.0.803

5 months ago

1.0.802

5 months ago

1.0.800

5 months ago

1.0.801

5 months ago

1.0.781

6 months ago

1.0.780

6 months ago

1.0.783

6 months ago

1.0.782

6 months ago

1.0.789

5 months ago

1.0.788

6 months ago

1.0.785

6 months ago

1.0.784

6 months ago

1.0.787

6 months ago

1.0.786

6 months ago

1.0.770

6 months ago

1.0.772

6 months ago

1.0.771

6 months ago

1.0.778

6 months ago

1.0.777

6 months ago

1.0.779

6 months ago

1.0.774

6 months ago

1.0.773

6 months ago

1.0.776

6 months ago

1.0.775

6 months ago

1.0.792

5 months ago

1.0.791

5 months ago

1.0.794

5 months ago

1.0.793

5 months ago

1.0.790

5 months ago

1.0.799

5 months ago

1.0.796

5 months ago

1.0.795

5 months ago

1.0.798

5 months ago

1.0.797

5 months ago

1.0.745

7 months ago

1.0.744

7 months ago

1.0.747

7 months ago

1.0.746

7 months ago

1.0.741

7 months ago

1.0.740

7 months ago

1.0.743

7 months ago

1.0.742

7 months ago

1.0.738

7 months ago

1.0.737

7 months ago

1.0.739

7 months ago

1.0.734

7 months ago

1.0.733

7 months ago

1.0.736

7 months ago

1.0.735

7 months ago

1.0.730

7 months ago

1.0.732

7 months ago

1.0.731

7 months ago

1.0.727

7 months ago

1.0.726

7 months ago

1.0.729

7 months ago

1.0.728

7 months ago

1.0.761

6 months ago

1.0.760

6 months ago

1.0.767

6 months ago

1.0.766

6 months ago

1.0.769

6 months ago

1.0.768

6 months ago

1.0.763

6 months ago

1.0.762

6 months ago

1.0.765

6 months ago

1.0.764

6 months ago

1.0.759

6 months ago

1.0.750

7 months ago

1.0.756

6 months ago

1.0.755

7 months ago

1.0.758

6 months ago

1.0.757

6 months ago

1.0.752

7 months ago

1.0.751

7 months ago

1.0.754

7 months ago

1.0.753

7 months ago

1.0.749

7 months ago

1.0.748

7 months ago

1.0.723

7 months ago

1.0.722

8 months ago

1.0.725

7 months ago

1.0.724

7 months ago

1.0.721

8 months ago

1.0.720

8 months ago

1.0.719

8 months ago

1.0.716

8 months ago

1.0.715

8 months ago

1.0.718

8 months ago

1.0.717

8 months ago

1.0.712

8 months ago

1.0.711

8 months ago

1.0.714

8 months ago

1.0.713

8 months ago

1.0.710

8 months ago

1.0.689

8 months ago

1.0.688

8 months ago

1.0.693

8 months ago

1.0.692

8 months ago

1.0.695

8 months ago

1.0.694

8 months ago

1.0.691

8 months ago

1.0.690

8 months ago

1.0.697

8 months ago

1.0.696

8 months ago

1.0.699

8 months ago

1.0.698

8 months ago

1.0.701

8 months ago

1.0.700

8 months ago

1.0.703

8 months ago

1.0.702

8 months ago

1.0.709

8 months ago

1.0.708

8 months ago

1.0.705

8 months ago

1.0.704

8 months ago

1.0.707

8 months ago

1.0.706

8 months ago

1.0.660

9 months ago

1.0.662

9 months ago

1.0.661

9 months ago

1.0.668

9 months ago

1.0.667

9 months ago

1.0.669

9 months ago

1.0.664

9 months ago

1.0.663

9 months ago

1.0.666

9 months ago

1.0.665

9 months ago

1.0.651

10 months ago

1.0.650

10 months ago

1.0.657

10 months ago

1.0.656

10 months ago

1.0.659

9 months ago

1.0.658

9 months ago

1.0.653

10 months ago

1.0.652

10 months ago

1.0.655

10 months ago

1.0.654

10 months ago

1.0.649

10 months ago

1.0.682

9 months ago

1.0.681

9 months ago

1.0.684

9 months ago

1.0.683

9 months ago

1.0.680

9 months ago

1.0.686

9 months ago

1.0.685

9 months ago

1.0.687

9 months ago

1.0.671

9 months ago

1.0.670

9 months ago

1.0.673

9 months ago

1.0.672

9 months ago

1.0.679

9 months ago

1.0.678

9 months ago

1.0.675

9 months ago

1.0.674

9 months ago

1.0.677

9 months ago

1.0.676

9 months ago

1.0.624

10 months ago

1.0.623

10 months ago

1.0.626

10 months ago

1.0.625

10 months ago

1.0.620

11 months ago

1.0.622

10 months ago

1.0.621

11 months ago

1.0.617

11 months ago

1.0.616

11 months ago

1.0.619

11 months ago

1.0.618

11 months ago

1.0.613

11 months ago

1.0.612

11 months ago

1.0.615

11 months ago

1.0.614

11 months ago

1.0.611

11 months ago

1.0.610

11 months ago

1.0.609

11 months ago

1.0.606

11 months ago

1.0.605

11 months ago

1.0.608

11 months ago

1.0.607

11 months ago

1.0.640

10 months ago

1.0.646

10 months ago

1.0.645

10 months ago

1.0.648

10 months ago

1.0.647

10 months ago

1.0.642

10 months ago

1.0.641

10 months ago

1.0.644

10 months ago

1.0.643

10 months ago

1.0.639

10 months ago

1.0.638

10 months ago

1.0.635

10 months ago

1.0.634

10 months ago

1.0.637

10 months ago

1.0.636

10 months ago

1.0.631

10 months ago

1.0.630

10 months ago

1.0.633

10 months ago

1.0.632

10 months ago

1.0.628

10 months ago

1.0.627

10 months ago

1.0.629

10 months ago

1.0.583

12 months ago

1.0.582

12 months ago

1.0.585

12 months ago

1.0.584

12 months ago

1.0.581

12 months ago

1.0.580

12 months ago

1.0.587

11 months ago

1.0.586

12 months ago

1.0.589

11 months ago

1.0.588

11 months ago

1.0.572

12 months ago

1.0.571

12 months ago

1.0.574

12 months ago

1.0.573

12 months ago

1.0.570

12 months ago

1.0.579

12 months ago

1.0.576

12 months ago

1.0.575

12 months ago

1.0.578

12 months ago

1.0.577

12 months ago

1.0.594

11 months ago

1.0.593

11 months ago

1.0.596

11 months ago

1.0.595

11 months ago

1.0.590

11 months ago

1.0.592

11 months ago

1.0.591

11 months ago

1.0.598

11 months ago

1.0.597

11 months ago

1.0.599

11 months ago

1.0.602

11 months ago

1.0.601

11 months ago

1.0.604

11 months ago

1.0.603

11 months ago

1.0.600

11 months ago

1.0.541

1 year ago

1.0.540

1 year ago

1.0.547

1 year ago

1.0.546

1 year ago

1.0.549

1 year ago

1.0.548

1 year ago

1.0.543

1 year ago

1.0.542

1 year ago

1.0.545

1 year ago

1.0.544

1 year ago

1.0.539

1 year ago

1.0.530

1 year ago

1.0.536

1 year ago

1.0.535

1 year ago

1.0.538

1 year ago

1.0.537

1 year ago

1.0.532

1 year ago

1.0.531

1 year ago

1.0.534

1 year ago

1.0.533

1 year ago

1.0.529

1 year ago

1.0.528

1 year ago

1.0.561

1 year ago

1.0.560

1 year ago

1.0.563

12 months ago

1.0.562

1 year ago

1.0.569

12 months ago

1.0.568

12 months ago

1.0.565

12 months ago

1.0.564

12 months ago

1.0.567

12 months ago

1.0.566

12 months ago

1.0.550

1 year ago

1.0.552

1 year ago

1.0.551

1 year ago

1.0.558

1 year ago

1.0.557

1 year ago

1.0.559

1 year ago

1.0.554

1 year ago

1.0.553

1 year ago

1.0.556

1 year ago

1.0.555

1 year ago

1.0.525

1 year ago

1.0.524

1 year ago

1.0.527

1 year ago

1.0.526

1 year ago

1.0.420

1 year ago

1.0.426

1 year ago

1.0.425

1 year ago

1.0.428

1 year ago

1.0.427

1 year ago

1.0.422

1 year ago

1.0.421

1 year ago

1.0.424

1 year ago

1.0.423

1 year ago

1.0.419

1 year ago

1.0.418

1 year ago

1.0.415

1 year ago

1.0.414

1 year ago

1.0.417

1 year ago

1.0.416

1 year ago

1.0.411

1 year ago

1.0.413

1 year ago

1.0.412

1 year ago

1.0.440

1 year ago

1.0.442

1 year ago

1.0.441

1 year ago

1.0.448

1 year ago

1.0.447

1 year ago

1.0.449

1 year ago

1.0.444

1 year ago

1.0.443

1 year ago

1.0.446

1 year ago

1.0.445

1 year ago

1.0.431

1 year ago

1.0.430

1 year ago

1.0.437

1 year ago

1.0.436

1 year ago

1.0.439

1 year ago

1.0.438

1 year ago

1.0.433

1 year ago

1.0.432

1 year ago

1.0.435

1 year ago

1.0.434

1 year ago

1.0.429

1 year ago

1.0.503

1 year ago

1.0.502

1 year ago

1.0.505

1 year ago

1.0.504

1 year ago

1.0.501

1 year ago

1.0.500

1 year ago

1.0.521

1 year ago

1.0.520

1 year ago

1.0.523

1 year ago

1.0.522

1 year ago

1.0.518

1 year ago

1.0.517

1 year ago

1.0.519

1 year ago

1.0.514

1 year ago

1.0.513

1 year ago

1.0.516

1 year ago

1.0.515

1 year ago

1.0.510

1 year ago

1.0.512

1 year ago

1.0.511

1 year ago

1.0.507

1 year ago

1.0.506

1 year ago

1.0.509

1 year ago

1.0.508

1 year ago

1.0.495

1 year ago

1.0.494

1 year ago

1.0.497

1 year ago

1.0.496

1 year ago

1.0.491

1 year ago

1.0.490

1 year ago

1.0.493

1 year ago

1.0.492

1 year ago

1.0.499

1 year ago

1.0.498

1 year ago

1.0.462

1 year ago

1.0.461

1 year ago

1.0.464

1 year ago

1.0.463

1 year ago

1.0.460

1 year ago

1.0.469

1 year ago

1.0.466

1 year ago

1.0.465

1 year ago

1.0.468

1 year ago

1.0.467

1 year ago

1.0.451

1 year ago

1.0.450

1 year ago

1.0.453

1 year ago

1.0.452

1 year ago

1.0.459

1 year ago

1.0.458

1 year ago

1.0.455

1 year ago

1.0.454

1 year ago

1.0.457

1 year ago

1.0.456

1 year ago

1.0.484

1 year ago

1.0.483

1 year ago

1.0.486

1 year ago

1.0.485

1 year ago

1.0.480

1 year ago

1.0.482

1 year ago

1.0.481

1 year ago

1.0.488

1 year ago

1.0.487

1 year ago

1.0.489

1 year ago

1.0.473

1 year ago

1.0.472

1 year ago

1.0.475

1 year ago

1.0.474

1 year ago

1.0.471

1 year ago

1.0.470

1 year ago

1.0.477

1 year ago

1.0.476

1 year ago

1.0.479

1 year ago

1.0.478

1 year ago

1.0.307

2 years ago

1.0.306

2 years ago

1.0.410

1 year ago

1.0.408

1 year ago

1.0.407

1 year ago

1.0.409

1 year ago

1.0.321

2 years ago

1.0.320

2 years ago

1.0.327

2 years ago

1.0.326

2 years ago

1.0.329

2 years ago

1.0.328

2 years ago

1.0.323

2 years ago

1.0.322

2 years ago

1.0.325

2 years ago

1.0.324

2 years ago

1.0.319

2 years ago

1.0.310

2 years ago

1.0.316

2 years ago

1.0.315

2 years ago

1.0.318

2 years ago

1.0.317

2 years ago

1.0.312

2 years ago

1.0.311

2 years ago

1.0.314

2 years ago

1.0.313

2 years ago

1.0.309

2 years ago

1.0.308

2 years ago

1.0.404

1 year ago

1.0.403

1 year ago

1.0.406

1 year ago

1.0.405

1 year ago

1.0.400

1 year ago

1.0.402

1 year ago

1.0.401

1 year ago

1.0.385

1 year ago

1.0.384

1 year ago

1.0.387

1 year ago

1.0.386

1 year ago

1.0.381

1 year ago

1.0.380

1 year ago

1.0.383

1 year ago

1.0.382

1 year ago

1.0.389

1 year ago

1.0.388

1 year ago

1.0.374

1 year ago

1.0.373

1 year ago

1.0.376

1 year ago

1.0.375

1 year ago

1.0.370

1 year ago

1.0.372

1 year ago

1.0.371

1 year ago

1.0.378

1 year ago

1.0.377

1 year ago

1.0.379

1 year ago

1.0.396

1 year ago

1.0.395

1 year ago

1.0.398

1 year ago

1.0.397

1 year ago

1.0.392

1 year ago

1.0.391

1 year ago

1.0.394

1 year ago

1.0.393

1 year ago

1.0.399

1 year ago

1.0.390

1 year ago

1.0.341

1 year ago

1.0.340

1 year ago

1.0.343

1 year ago

1.0.342

1 year ago

1.0.349

1 year ago

1.0.348

1 year ago

1.0.345

1 year ago

1.0.344

1 year ago

1.0.347

1 year ago

1.0.346

1 year ago

1.0.330

2 years ago

1.0.332

2 years ago

1.0.331

2 years ago

1.0.338

2 years ago

1.0.337

2 years ago

1.0.339

2 years ago

1.0.334

2 years ago

1.0.333

2 years ago

1.0.336

2 years ago

1.0.335

2 years ago

1.0.363

1 year ago

1.0.362

1 year ago

1.0.365

1 year ago

1.0.364

1 year ago

1.0.361

1 year ago

1.0.360

1 year ago

1.0.367

1 year ago

1.0.366

1 year ago

1.0.369

1 year ago

1.0.368

1 year ago

1.0.352

1 year ago

1.0.351

1 year ago

1.0.354

1 year ago

1.0.353

1 year ago

1.0.350

1 year ago

1.0.359

1 year ago

1.0.356

1 year ago

1.0.355

1 year ago

1.0.358

1 year ago

1.0.357

1 year ago

1.0.305

2 years ago

1.0.304

2 years ago

1.0.301

2 years ago

1.0.300

2 years ago

1.0.303

2 years ago

1.0.302

2 years ago

1.0.297

2 years ago

1.0.296

2 years ago

1.0.299

2 years ago

1.0.298

2 years ago

1.0.293

2 years ago

1.0.292

2 years ago

1.0.295

2 years ago

1.0.294

2 years ago

1.0.291

2 years ago

1.0.290

2 years ago

1.0.264

2 years ago

1.0.263

2 years ago

1.0.266

2 years ago

1.0.265

2 years ago

1.0.260

2 years ago

1.0.262

2 years ago

1.0.261

2 years ago

1.0.268

2 years ago

1.0.267

2 years ago

1.0.269

2 years ago

1.0.259

2 years ago

1.0.258

2 years ago

1.0.286

2 years ago

1.0.285

2 years ago

1.0.288

2 years ago

1.0.287

2 years ago

1.0.282

2 years ago

1.0.281

2 years ago

1.0.284

2 years ago

1.0.283

2 years ago

1.0.289

2 years ago

1.0.280

2 years ago

1.0.275

2 years ago

1.0.274

2 years ago

1.0.277

2 years ago

1.0.276

2 years ago

1.0.271

2 years ago

1.0.270

2 years ago

1.0.273

2 years ago

1.0.272

2 years ago

1.0.279

2 years ago

1.0.278

2 years ago

1.0.200

2 years ago

1.0.206

2 years ago

1.0.205

2 years ago

1.0.208

2 years ago

1.0.207

2 years ago

1.0.202

2 years ago

1.0.201

2 years ago

1.0.204

2 years ago

1.0.203

2 years ago

1.0.187

2 years ago

1.0.186

2 years ago

1.0.189

2 years ago

1.0.188

2 years ago

1.0.183

2 years ago

1.0.182

2 years ago

1.0.185

2 years ago

1.0.184

2 years ago

1.0.181

2 years ago

1.0.180

2 years ago

1.0.176

2 years ago

1.0.175

2 years ago

1.0.178

2 years ago

1.0.177

2 years ago

1.0.172

2 years ago

1.0.171

2 years ago

1.0.174

2 years ago

1.0.173

2 years ago

1.0.179

2 years ago

1.0.170

2 years ago

1.0.198

2 years ago

1.0.197

2 years ago

1.0.199

2 years ago

1.0.194

2 years ago

1.0.193

2 years ago

1.0.196

2 years ago

1.0.195

2 years ago

1.0.190

2 years ago

1.0.192

2 years ago

1.0.191

2 years ago

1.0.143

2 years ago

1.0.142

2 years ago

1.0.145

2 years ago

1.0.144

2 years ago

1.0.141

2 years ago

1.0.140

2 years ago

1.0.147

2 years ago

1.0.146

2 years ago

1.0.149

2 years ago

1.0.148

2 years ago

1.0.253

2 years ago

1.0.132

2 years ago

1.0.252

2 years ago

1.0.255

2 years ago

1.0.134

2 years ago

1.0.254

2 years ago

1.0.133

2 years ago

1.0.251

2 years ago

1.0.250

2 years ago

1.0.139

2 years ago

1.0.257

2 years ago

1.0.136

2 years ago

1.0.256

2 years ago

1.0.135

2 years ago

1.0.138

2 years ago

1.0.137

2 years ago

1.0.165

2 years ago

1.0.164

2 years ago

1.0.167

2 years ago

1.0.166

2 years ago

1.0.161

2 years ago

1.0.160

2 years ago

1.0.163

2 years ago

1.0.162

2 years ago

1.0.169

2 years ago

1.0.168

2 years ago

1.0.154

2 years ago

1.0.153

2 years ago

1.0.156

2 years ago

1.0.155

2 years ago

1.0.150

2 years ago

1.0.152

2 years ago

1.0.151

2 years ago

1.0.158

2 years ago

1.0.157

2 years ago

1.0.159

2 years ago

1.0.220

2 years ago

1.0.222

2 years ago

1.0.221

2 years ago

1.0.228

2 years ago

1.0.227

2 years ago

1.0.229

2 years ago

1.0.224

2 years ago

1.0.223

2 years ago

1.0.226

2 years ago

1.0.225

2 years ago

1.0.211

2 years ago

1.0.210

2 years ago

1.0.217

2 years ago

1.0.216

2 years ago

1.0.219

2 years ago

1.0.218

2 years ago

1.0.213

2 years ago

1.0.212

2 years ago

1.0.215

2 years ago

1.0.214

2 years ago

1.0.209

2 years ago

1.0.242

2 years ago

1.0.241

2 years ago

1.0.244

2 years ago

1.0.243

2 years ago

1.0.240

2 years ago

1.0.249

2 years ago

1.0.246

2 years ago

1.0.245

2 years ago

1.0.248

2 years ago

1.0.247

2 years ago

1.0.231

2 years ago

1.0.230

2 years ago

1.0.233

2 years ago

1.0.232

2 years ago

1.0.239

2 years ago

1.0.238

2 years ago

1.0.235

2 years ago

1.0.234

2 years ago

1.0.237

2 years ago

1.0.236

2 years ago

1.0.131

2 years ago

1.0.130

2 years ago

1.0.107

2 years ago

1.0.106

2 years ago

1.0.109

2 years ago

1.0.108

2 years ago

1.0.105

2 years ago

1.0.121

2 years ago

1.0.120

2 years ago

1.0.123

2 years ago

1.0.122

2 years ago

1.0.129

2 years ago

1.0.128

2 years ago

1.0.125

2 years ago

1.0.124

2 years ago

1.0.127

2 years ago

1.0.126

2 years ago

1.0.110

2 years ago

1.0.112

2 years ago

1.0.111

2 years ago

1.0.118

2 years ago

1.0.117

2 years ago

1.0.119

2 years ago

1.0.114

2 years ago

1.0.113

2 years ago

1.0.116

2 years ago

1.0.115

2 years ago

1.0.62

2 years ago

1.0.66

2 years ago

1.0.65

2 years ago

1.0.64

2 years ago

1.0.63

2 years ago

1.0.69

2 years ago

1.0.68

2 years ago

1.0.67

2 years ago

1.0.73

2 years ago

1.0.72

2 years ago

1.0.71

2 years ago

1.0.70

2 years ago

1.0.77

2 years ago

1.0.76

2 years ago

1.0.75

2 years ago

1.0.74

2 years ago

1.0.79

2 years ago

1.0.78

2 years ago

1.0.101

2 years ago

1.0.100

2 years ago

1.0.103

2 years ago

1.0.102

2 years ago

1.0.104

2 years ago

1.0.80

2 years ago

1.0.84

2 years ago

1.0.83

2 years ago

1.0.82

2 years ago

1.0.81

2 years ago

1.0.88

2 years ago

1.0.87

2 years ago

1.0.86

2 years ago

1.0.85

2 years ago

1.0.89

2 years ago

1.0.91

2 years ago

1.0.90

2 years ago

1.0.95

2 years ago

1.0.94

2 years ago

1.0.93

2 years ago

1.0.92

2 years ago

1.0.99

2 years ago

1.0.98

2 years ago

1.0.97

2 years ago

1.0.96

2 years ago

1.0.61

2 years ago

1.0.60

2 years ago

1.0.55

2 years ago

1.0.54

2 years ago

1.0.53

2 years ago

1.0.52

2 years ago

1.0.59

2 years ago

1.0.58

2 years ago

1.0.57

2 years ago

1.0.56

2 years ago

1.0.51

2 years ago

1.0.50

2 years ago

1.0.49

2 years ago

1.0.48

2 years ago

1.0.47

2 years ago

1.0.46

2 years ago

1.0.45

2 years ago

1.0.44

2 years ago

1.0.43

2 years ago

1.0.42

2 years ago

1.0.41

2 years ago

1.0.40

2 years ago

1.0.39

2 years ago

1.0.38

2 years ago

1.0.37

2 years ago

1.0.36

2 years ago

1.0.35

2 years ago

1.0.34

2 years ago

1.0.33

2 years ago

1.0.32

2 years ago

1.0.31

2 years ago

1.0.30

2 years ago

1.0.29

2 years ago

1.0.28

2 years ago

1.0.27

2 years ago

1.0.26

2 years ago

1.0.25

2 years ago

1.0.24

2 years ago

1.0.23

2 years ago

1.0.22

2 years ago

1.0.21

2 years ago

1.0.20

2 years ago

1.0.19

2 years ago

1.0.18

2 years ago

1.0.17

2 years ago

1.0.16

2 years ago

1.0.15

2 years ago

1.0.14

2 years ago

1.0.13

2 years ago

1.0.12

2 years ago

1.0.11

2 years ago

1.0.10

2 years ago

1.0.9

2 years ago

1.0.8

2 years ago

1.0.7

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago

0.0.1

2 years ago