Showing preview only (234K chars total). Download the full file or copy to clipboard to get everything.
Repository: jorgehpo/notebookJS
Branch: main
Commit: 5a930661420b
Files: 33
Total size: 216.3 KB
Directory structure:
gitextract_k0oa75uh/
├── .gitignore
├── Examples/
│ ├── 1_HelloWorld/
│ │ └── HelloWorld.ipynb
│ ├── 2_SimpleD3_Circle/
│ │ ├── SimpleD3_Circle.ipynb
│ │ └── draw_circle_lib.js
│ ├── 3_RadialBarChart/
│ │ ├── RadialBarChart.ipynb
│ │ ├── energy.csv
│ │ ├── radial_bar.css
│ │ └── radial_bar_lib.js
│ ├── 4_Bidirectional_Comm/
│ │ ├── Bar_Chart_Bidirectional_Comm.ipynb
│ │ └── bar_chart_lib.js
│ ├── 5_Webpack_BaseballAnnotator_Bidirectional/
│ │ ├── BaseballAnnotator.ipynb
│ │ └── BaseballVisualizer/
│ │ ├── js/
│ │ │ ├── DraggableTimeline.js
│ │ │ ├── PlayDiagram.js
│ │ │ ├── TrajectoryAnnotator.js
│ │ │ ├── helpers.js
│ │ │ └── index.js
│ │ ├── package.json
│ │ ├── play_annotated.csv
│ │ └── webpack.config.js
│ ├── 6_HelloWorld_Bidirectional/
│ │ └── HelloWorld_Bidirectional.ipynb
│ └── 7_D3_scatterplot/
│ ├── D3_Scatter.ipynb
│ ├── Prices.csv
│ └── scatterplot_lib.js
├── Images/
│ └── notebookJS.ai
├── LICENSE
├── MANIFEST.in
├── README.md
├── notebookjs/
│ ├── __init__.py
│ ├── _comm.py
│ ├── _display.py
│ └── resources/
│ ├── CommAPI.js
│ └── template.html
└── setup.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
*.egg-info
.DS_Store
__pycache__
build
dist
node_modules
.ipynb_checkpoints
================================================
FILE: Examples/1_HelloWorld/HelloWorld.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Hello World\n",
"\n",
"Adding a text element to a Notebook output cell using plain JavaScript"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from notebookjs import execute_js"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Writing the js function"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"helloworld_js = \"\"\"\n",
"function helloworld(div_id, data){\n",
" document.querySelector(div_id).textContent=data.text;\n",
"}\n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Running the code"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"execute_js(helloworld_js, \"helloworld\", {\"text\": \"Hello World\"})"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: Examples/2_SimpleD3_Circle/SimpleD3_Circle.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Simple D3 Circle\n",
"\n",
"This notebook shows how to load D3js from an URL and draw a simple circle in a notebook"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from notebookjs import execute_js"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setting up the JavaScript libraries\n",
"\n",
"We are using two JavaScript libraries: D3 and a local \"draw_circle_lib\" library.\n",
"\n",
"- D3 is loaded from the web (notebookJS takes care of downloading files from URLs). \n",
"\n",
"- draw_circle_lib is loaded from a local file.\n",
"\n",
"**Note that we are using D3 V3.**\n",
"More recent versions of D3 use ES6 and cannot be directly loaded in the notebook script tag. We recommend using a javascript build tool such as babel + webpack to use more modern libraries."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"with open(\"./draw_circle_lib.js\", \"r\") as f:\n",
" draw_circle_lib = f.read()\n",
" \n",
"d3_lib_url = \"https://d3js.org/d3.v3.min.js\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This is the D3 function to draw a circle: "
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(draw_circle_lib)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Running the code"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"execute_js([d3_lib_url, draw_circle_lib], \"draw_circle\", {\"color\": \"#4682B4\"})"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: Examples/2_SimpleD3_Circle/draw_circle_lib.js
================================================
function draw_circle(id, data){
d3.select(id)
.append("div")
.style("width", "50px")
.style("height", "50px")
.style("background-color", data.color)
.style("border-radius", "50px")
}
================================================
FILE: Examples/3_RadialBarChart/RadialBarChart.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Radial Bar Chart\n",
"\n",
"We port the Radial Bar Chart implemented in D3 to a Jupyter Notebook.\n",
"Code adapted from https://bl.ocks.org/AntonOrlov/6b42d8676943cc933f48a43a7c7e5b6c"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Loading the radial bar chart code. \n",
"\n",
"We load both js and css scripts"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"d3_lib_url = \"https://d3js.org/d3.v3.min.js\"\n",
"\n",
"with open(\"radial_bar.css\", \"r\") as f:\n",
" radial_bar_css = f.read()\n",
" \n",
"with open (\"radial_bar_lib.js\", \"r\") as f:\n",
" radial_bar_lib = f.read()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Loading data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"energy = pd.read_csv(\"energy.csv\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting the bar chart \n",
"\n",
"Radial Bar Chart of energy consumption over five months"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from notebookjs import execute_js\n",
"execute_js(library_list=[d3_lib_url, radial_bar_lib], main_function=\"radial_bar\", \n",
" data_dict=energy.to_dict(orient=\"records\"), css_list=[radial_bar_css])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: Examples/3_RadialBarChart/energy.csv
================================================
name,value
Jan,432
Feb,340
Mar,382
Apr,398
May,410
================================================
FILE: Examples/3_RadialBarChart/radial_bar.css
================================================
body {
font: 12px sans-serif;
}
svg {
margin: 0px auto;
display: block;
}
path.arc {
opacity: 0.9;
transition: opacity 0.5s;
}
path.arc:hover {
opacity: 0.7;
}
.axis line, .axis circle {
stroke: #cccccc;
stroke-width: 1px
}
.axis circle {
fill: none;
}
.r.axis text {
text-anchor: end
}
.tooltip {
position: absolute;
display: none;
background: rgba(0, 0, 0, 0.6);
border-radius: 3px;
box-shadow: -3px 3px 15px #888;
color: white;
padding: 6px;
}
================================================
FILE: Examples/3_RadialBarChart/radial_bar_lib.js
================================================
function radial_bar(div_id, data){
// Radial Bar Chart
// Code adapted from: https://bl.ocks.org/AntonOrlov/6b42d8676943cc933f48a43a7c7e5b6c
// We have changed the data loading lines (to receive the parameter data) and ported the code to D3 V3.
const width = 960,
height = 500,
chartRadius = height / 2 - 40;
const color = d3.scale.category10();
let svg = d3.select(div_id).append('svg')
.attr('width', width)
.attr('height', height)
.append('g')
.attr('transform', 'translate(' + width / 2 + ',' + height / 2 + ')');
let tooltip = d3.select('body').append('div')
.attr('class', 'tooltip');
const PI = Math.PI,
arcMinRadius = 10,
arcPadding = 10,
labelPadding = -5,
numTicks = 10;
let scale = d3.scale.linear()
.domain([0, d3.max(data, d => d.value) * 1.1])
.range([0, 2 * PI]);
let ticks = scale.ticks(numTicks).slice(0, -1);
let keys = data.map((d, i) => d.name);
//number of arcs
const numArcs = keys.length;
const arcWidth = (chartRadius - arcMinRadius - numArcs * arcPadding) / numArcs;
let arc = d3.svg.arc()
.innerRadius((d, i) => getInnerRadius(i))
.outerRadius((d, i) => getOuterRadius(i))
.startAngle(0)
.endAngle((d, i) => scale(d))
let radialAxis = svg.append('g')
.attr('class', 'r axis')
.selectAll('g')
.data(data)
.enter().append('g');
radialAxis.append('circle')
.attr('r', (d, i) => getOuterRadius(i) + arcPadding);
radialAxis.append('text')
.attr('x', labelPadding)
.attr('y', (d, i) => -getOuterRadius(i) + arcPadding)
.text(d => d.name);
let axialAxis = svg.append('g')
.attr('class', 'a axis')
.selectAll('g')
.data(ticks)
.enter().append('g')
.attr('transform', d => 'rotate(' + (rad2deg(scale(d)) - 90) + ')');
axialAxis.append('line')
.attr('x2', chartRadius);
axialAxis.append('text')
.attr('x', chartRadius + 10)
.style('text-anchor', d => (scale(d) >= PI && scale(d) < 2 * PI ? 'end' : null))
.attr('transform', d => 'rotate(' + (90 - rad2deg(scale(d))) + ',' + (chartRadius + 10) + ',0)')
.text(d => d);
//data arcs
let arcs = svg.append('g')
.attr('class', 'data')
.selectAll('path')
.data(data)
.enter().append('path')
.attr('class', 'arc')
.style('fill', (d, i) => color(i))
arcs.transition()
.delay((d, i) => i * 200)
.duration(1000)
.attrTween('d', arcTween);
arcs.on('mousemove', showTooltip)
arcs.on('mouseout', hideTooltip)
function arcTween(d, i) {
let interpolate = d3.interpolate(0, d.value);
return t => arc(interpolate(t), i);
}
function showTooltip(d) {
tooltip.style('left', (d3.event.pageX + 10) + 'px')
.style('top', (d3.event.pageY - 25) + 'px')
.style('display', 'inline-block')
.html(d.value);
}
function hideTooltip() {
tooltip.style('display', 'none');
}
function rad2deg(angle) {
return angle * 180 / PI;
}
function getInnerRadius(index) {
return arcMinRadius + (numArcs - (index + 1)) * (arcWidth + arcPadding);
}
function getOuterRadius(index) {
return getInnerRadius(index) + arcWidth;
}
}
================================================
FILE: Examples/4_Bidirectional_Comm/Bar_Chart_Bidirectional_Comm.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Bar chart example with bidirectional communication"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from notebookjs import execute_js"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Loading libraries"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"d3_lib_url = \"https://d3js.org/d3.v3.min.js\"\n",
"\n",
"with open(\"bar_chart_lib.js\", \"r\") as f:\n",
" bar_chart_lib = f.read()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### The bar chart displays the array data in order"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"data_dict = {\n",
" \"array\": [1,2,3]\n",
"}\n",
"execute_js(library_list=[d3_lib_url, bar_chart_lib], main_function=\"bar_chart\", data_dict=data_dict)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Set up data update callback"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import random\n",
"\n",
"def random_array(data):\n",
" # Makes an array of <data[\"n\"]> random numbers\n",
" n = data[\"n\"]\n",
" return {'array': [random.random() for x in range(n)]}\n",
"\n",
"callbacks = {'random_array': random_array}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Update the bar chart every 2 seconds using callback"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"update_func_js = \"\"\"\n",
"function set_update(div_id, _){ \n",
" comm = new CommAPI(\"random_array\", (data) => {\n",
" d3.select(div_id).selectAll(\"*\").remove();\n",
" bar_chart(div_id, data);\n",
" });\n",
" comm.call({n: 5})\n",
" setInterval(function(){ comm.call({n: 5}) }, 2000);\n",
"}\n",
"\"\"\"\n",
"\n",
"execute_js(library_list=[d3_lib_url, bar_chart_lib, update_func_js], main_function=\"set_update\", callbacks=callbacks)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: Examples/4_Bidirectional_Comm/bar_chart_lib.js
================================================
function bar_chart(div_id, data_dict){
const data = data_dict.array;
const div = d3.select(div_id)
const height = data.length * 20;
const scaleY = d3.scale.ordinal()
.domain(d3.range(data.length))
.rangeRoundBands([0, height], .1);
const scaleX = d3.scale.linear()
.domain(d3.extent(data))
.range([1, 120]);
const svg = div.append("svg")
.style("width", "120px")
.style("height", height+"px");
svg.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("x", 0)
.attr("y", (d, i) => scaleY(i))
.attr("width", d => scaleX(d))
.attr("height", scaleY.rangeBand());
}
================================================
FILE: Examples/5_Webpack_BaseballAnnotator_Bidirectional/BaseballAnnotator.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Baseball Visualizer and Annotator - Bidirectional communication"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This visualization shows an interactive chart that displays baseball game trajectories. The user can control the progress of the play using a slider. Furthermore, the user can select a player or the ball to edit its trajectory (either clicking on the field, or using the button \"Clear trajectory\"). Visualization based on the paper HistoryTracker (Ono et al, 2019)."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Loading code bundle (built with Webpack)\n",
"\n",
"Source code for the bundle is in BaseballVisualizer/js.\n",
"\n",
"To build the library from scratch, run\n",
"\n",
"```\n",
"cd BaseballVisualizer\n",
"npm install\n",
"npm run build\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"with open(\"BaseballVisualizer/build/baseballvisualizer.js\", \"r\") as f:\n",
" code_bundle = f.read()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Loading the data (baseball play trajectory in CSV)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"play_csv = pd.read_csv(\"./BaseballVisualizer/play_annotated.csv\")\n",
"data_dict = {'tracking': play_csv.to_json(orient=\"records\")}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Setting up callback\n",
"\n",
"The callback function will set the received_trajectory variable when the user clicks the button \"Submit\""
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"received_trajectory = None\n",
"\n",
"def receive_trajectory(data):\n",
" global received_trajectory \n",
" received_trajectory = data['trajectory']\n",
" return {\"received\": True}\n",
" \n",
"callbacks = {'submit_trajectory': receive_trajectory}"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"In javascript, the callback call is done in BaseballVisualizer/js/TrajectoryAnnotator.js\n",
"\n",
"```Javascript\n",
"function submitTrajectoryToServer(tracking){\n",
" const alert_sent = ()=>{alert(\"Trajectory sent to Jupyter Notebook.\")};\n",
" let comm = new CommAPI(\"submit_trajectory\", alert_sent)\n",
"\n",
" // Send data\n",
" comm.call({'trajectory': tracking})\n",
"}\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Rendering Visualization"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from notebookjs import execute_js\n",
"\n",
"execute_js(library_list=code_bundle, \n",
" main_function=\"baseballvisualizer.renderBaseballAnnotator\", \n",
" data_dict=data_dict, \n",
" callbacks=callbacks)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"received_trajectory"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: Examples/5_Webpack_BaseballAnnotator_Bidirectional/BaseballVisualizer/js/DraggableTimeline.js
================================================
import React from "react";
import PropTypes from 'prop-types';
import * as d3 from 'd3';
import Slider from 'rc-slider';
import 'rc-slider/assets/index.css';
export default class DraggableTimeline extends React.Component {
shouldComponentUpdate(nextProps, nextState) {
if (this.props.tracking === nextProps.tracking) {
return false;
}
return true;
}
render () {
const tracking = this.props.tracking;
const annotatedPoints = {};
tracking.forEach(({x, y, t}, idx) =>
{
annotatedPoints[t] = {};
});
const createSliderWithTooltip = Slider.createSliderWithTooltip;
const SliderTP = createSliderWithTooltip(Slider);
return (
<div style={{width: this.props.width, marginBottom: 15}}>
<SliderTP
min={0}
max={this.props.trackingDuration}
step={0.01}
defaultValue={this.props.playerHead}
onChange={value => {this.props.onDragTime(value)}}
marks={annotatedPoints}
activeDotStyle={{ borderColor: 'steelblue' }}
dotStyle={{borderColor: 'steelblue' }}
trackStyle={{ backgroundColor: 'steelblue' }}
railStyle={{ backgroundColor: 'steelblue' }}
width={this.props.width}
/>
</div>
);
}
}
DraggableTimeline.propTypes = {
width: PropTypes.number.isRequired,
height: PropTypes.number.isRequired,
tracking: PropTypes.array,
playerHead: PropTypes.number,
margin: PropTypes.object,
onDragTime: PropTypes.func.isRequired,
trackingDuration: PropTypes.number.isRequired,
};
DraggableTimeline.defaultProps = {
width: 400,
height: 10,
margin: {top:10, bottom: 10, left: 10, right:10}
};
================================================
FILE: Examples/5_Webpack_BaseballAnnotator_Bidirectional/BaseballVisualizer/js/PlayDiagram.js
================================================
import React, { Component } from 'react';
import PropTypes from "prop-types";
import { mapFieldSVG, mapSVGField, constants, mapFieldSVGY, mapFieldSVGX, interpolatePositions } from './helpers';
import $ from "jquery";
import * as d3 from "d3";
import fieldsvg from "./field.svg";
export default class PlayDiagram extends Component {
render() {
let ball = null;
let line = d3.line()
.x((d) => {
return mapFieldSVGX(d.x);
})
.y((d) => {
return mapFieldSVGY(d.y);
});
const lineElems = [];
const endElems = [];
constants.gameElements.forEach( elem => {
if (this.props.tracking && this.props.tracking[elem] && this.props.tracking[elem].length > 0){
const tracking = this.props.tracking;
const newTrackingElem = [];
for (let i = 0; i < tracking[elem].length; ++i){
if (tracking[elem][i].t > this.props.playUpTo){
break;
}
newTrackingElem.push(tracking[elem][i]);
}
const lastPos = interpolatePositions(this.props.playUpTo, tracking[elem]);
newTrackingElem.push( {...lastPos, t: this.props.playUpTo} );
lineElems.push(
<path
d={line(newTrackingElem)}
style={{
strokeWidth: 0.6,
strokeOpacity: 1,
strokeDasharray: elem==="BALL" ? "3 3" : "0",
fillOpacity: 0,
stroke: "#000"
}}
key={elem}
/>);
if (elem === this.props.annotationElem) {
endElems.push(<circle
cx={mapFieldSVGX(lastPos.x)}
cy={mapFieldSVGY(lastPos.y)}
r={3}
style={{
fill: 'white',
stroke: 'black',
strokeWidth: 1
}}
key={elem}
/>);
} else {
endElems.push(
<circle
cx={mapFieldSVGX(lastPos.x)}
cy={mapFieldSVGY(lastPos.y)}
r={1}
style={{
stroke: "#000",
fill: "#000"
}}
key={elem}
/>
);
}
}
});
return (
<svg id="playDiagramBallSVG" viewBox={"0 0 250 250"} style={{width:this.props.width, height: this.props.height}}
onClick={(evt)=> {
let container = $("#playDiagramBallSVG").get(0).getBoundingClientRect();
let x = evt.clientX - container.left;
let y = evt.clientY - container.top;
const scaleX = 250/this.props.width;
const scaleY = 250/this.props.height;
let mapped = mapSVGField([x * scaleX, y * scaleY]);
this.props.onClick(mapped);
}}>
<image width={250} height={250} xlinkHref={fieldsvg}/>
{lineElems}
{endElems}
{ball}
</svg>
);
}
}
PlayDiagram.propTypes = {
width: PropTypes.number.isRequired,
height: PropTypes.number.isRequired,
onClick: PropTypes.func,
playUpTo: PropTypes.number,
tracking: PropTypes.object,
annotationElem: PropTypes.string
};
PlayDiagram.defaultProps = {
width: 500,
height: 500
};
================================================
FILE: Examples/5_Webpack_BaseballAnnotator_Bidirectional/BaseballVisualizer/js/TrajectoryAnnotator.js
================================================
import React, { Component } from 'react';
import PlayDiagram from './PlayDiagram';
import {interpolatePositions, constants, convert_data_format} from './helpers';
import {Container, Row, Col, Button} from 'react-bootstrap';
import 'rc-select/assets/index.less';
import DraggableTimeline from "./DraggableTimeline";
import PropTypes from 'prop-types';
function submitTrajectoryToServer(tracking){
const alert_sent = ()=>{alert("Trajectory sent to Jupyter Notebook.")};
let comm = new CommAPI("submit_trajectory", alert_sent)
// Send data
comm.call({'trajectory': tracking})
}
function convertRawTrackingToTrajectory(rawTracking) {
if (rawTracking === null) return [];
let tracking = Object.create(null);
constants.gameElements.forEach(element => {
tracking[element] = [];
for (let i = 0; i < rawTracking.length; ++i) {
if (rawTracking[i][element + "_x"] !== null) {
tracking[element].push({
x: rawTracking[i][element + "_x"],
y: rawTracking[i][element + "_y"],
t: rawTracking[i]["time_elapsed_sec"]
});
}
}
});
return tracking;
}
export default class TrajectoryAnnotator extends Component {
constructor(props){
super(props);
this.state = {
tracking: convertRawTrackingToTrajectory(this.props.tracking),
trackingDuration: this.props.tracking[this.props.tracking.length-1].time_elapsed_sec,
playerHead: 0,
curTracking: "B"
};
this.clickPlayDiagram = this.clickPlayDiagram.bind(this);
}
clickPlayDiagram(position) {
const curTracking = this.state.curTracking;
let newTracking = this.state.tracking[curTracking].filter(annotation => {
return Math.abs(annotation.t - this.state.playerHead) > 1e-1;
});
newTracking.push({
x: position[0],
y: position[1],
t: this.state.playerHead
});
const allTrackings = {
...this.state.tracking,
};
allTrackings[curTracking] = newTracking;
this.setState({tracking: allTrackings});
}
render() {
return (
<div>
Selected Position
<div style={{display: 'flex'}}>
{
constants.gameElements.map((elem) => {
return <label key={elem} style={{marginRight:15}}>
<input
type="radio" value={elem}
checked={this.state.curTracking === elem}
onChange={(changeEvent) => {this.setState({curTracking: changeEvent.target.value})}}
style={{marginRight: 5}}
/>
{elem}
</label>
})
}
</div>
<PlayDiagram
width={500}
height={500}
onClick={this.clickPlayDiagram}
tracking={this.state.tracking}
playUpTo={this.state.playerHead}
annotationElem={this.state.curTracking}
/>
<DraggableTimeline
x={0}
y={0}
width={500}
height={50}
tracking={this.state.tracking[this.state.curTracking]}
playerHead={this.state.playerHead}
onDragTime={(time) => {this.setState({playerHead: time})}}
trackingDuration={this.state.trackingDuration}
/>
<Button
onClick={()=>{
const originalDataFormat = convert_data_format(this.state.tracking);
submitTrajectoryToServer(originalDataFormat);
}}
>
Submit
</Button>
<Button
style={{marginLeft: 20}}
onClick={() => {
let newTracking = {
...this.state.tracking
};
newTracking[this.state.curTracking] = [];
this.setState({tracking: newTracking});
}}
>
Clear trajectory
</Button>
</div>
);
}
}
TrajectoryAnnotator.propTypes = {
tracking: PropTypes.arrayOf(PropTypes.object).isRequired
};
================================================
FILE: Examples/5_Webpack_BaseballAnnotator_Bidirectional/BaseballVisualizer/js/helpers.js
================================================
import {linear} from 'everpolate';
export const constants = {
gameElements: ["P", "B", "R@1", "R@2", "R@3", "1B", "2B", "3B", "SS", "LF", "CF", "RF", "C",
"BALL"],
gameElementsDesc: {
"P": "Pitcher",
"B": "Batter",
"R@1": "Runner at first",
"R@2": "Runner at second",
"R@3": "Runner at third",
"1B": "First baseman",
"2B": "Second baseman",
"3B": "Third baseman",
"SS": "Shortstop",
"LF": "Left fielder",
"CF": "Center fielder",
"RF": "Right fielder",
"C": "Catcher",
"BALL": "Ball"
},
};
const input2ndBase = [0.0, 127.2792206],
outputHomePlate = [125.2, 203.5],
output2ndBase = [125.2, 150.8],
inputScale = 1.0 / input2ndBase[1],
outputScale = 1.0 / (output2ndBase[1] - outputHomePlate[1]);
export function mapFieldSVGX(x){
const x2 = (((-x) * inputScale) / outputScale) + outputHomePlate[0];
return x2;
}
export function mapFieldSVGY(y){
const y2 = (y * inputScale) / outputScale + outputHomePlate[1];
return y2;
}
export function mapFieldSVG([x, y]){
const x2 = (((-x) * inputScale) / outputScale) + outputHomePlate[0];
const y2 = (y * inputScale) / outputScale + outputHomePlate[1];
return [x2, y2];
}
export function mapSVGField([x2, y2]){
const x = -((x2 - outputHomePlate[0]) * outputScale) / inputScale;
const y = ((y2 - outputHomePlate[1]) * outputScale) / inputScale;
return [x, y];
}
export function interpolatePositions(tQuery, positions) {
//positions: array of [{x, y, t}, ...]
if (positions.length === 1){
return {x: positions[0].x, y:positions[0].y};
}
positions.sort((a,b) => a.t - b.t);
if (tQuery <= positions[0].t) {
return {x: positions[0].x, y: positions[0].y}
}
if (tQuery >= positions[positions.length-1].t) {
return {x: positions[positions.length-1].x, y: positions[positions.length-1].y}
}
const t = positions.map(p=>p.t);
const x = positions.map(p=>p.x);
const y = positions.map(p=>p.y);
const mappedX = linear(tQuery, t, x);
const mappedY = linear(tQuery, t, y);
return {x: mappedX, y: mappedY};
}
export function convert_data_format(tracking){
let csvObj = {};
constants.gameElements.forEach(elem => {
tracking[elem].forEach( ({x, y, t}) => {
if (!csvObj[t]) {
csvObj[t] = {"time_elapsed_sec": t};
constants.gameElements.forEach(ename => {
csvObj[t][ename + "_x"] = null;
csvObj[t][ename + "_y"] = null;
})
}
csvObj[t][elem + "_x"] = x;
csvObj[t][elem + "_y"] = y;
});
});
const timeKeys = Object.keys(csvObj);
timeKeys.sort((a, b) => a - b);
const csvArray = [];
timeKeys.forEach(key => {
csvArray.push(csvObj[key]);
});
return csvArray;
}
================================================
FILE: Examples/5_Webpack_BaseballAnnotator_Bidirectional/BaseballVisualizer/js/index.js
================================================
import React from "react";
import ReactDOM from "react-dom";
import { select } from "d3-selection";
import TrajectoryAnnotator from "./TrajectoryAnnotator";
export function renderBaseballAnnotator(divName, data){
ReactDOM.render(
<TrajectoryAnnotator tracking={JSON.parse(data.tracking)}/>
, select(divName).node());
}
================================================
FILE: Examples/5_Webpack_BaseballAnnotator_Bidirectional/BaseballVisualizer/package.json
================================================
{
"name": "baseballvisualizer",
"version": "1.0.0",
"description": "library to plot and edit baseball trajectories",
"main": "./js/index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"build": "webpack",
"start": "webpack-dev-server --progress --colors --content-base dist/"
},
"author": "Jorge Piazentin Ono",
"license": "UNLICENSED",
"devDependencies": {
"@babel/core": "^7.12.9",
"@babel/preset-env": "^7.12.7",
"@babel/preset-react": "^7.12.7",
"babel-loader": "^8.2.2",
"css-loader": "^2.1.1",
"file-loader": "^3.0.1",
"less": "^4.0.0",
"less-loader": "^7.1.0",
"prop-types": "^15.6.2",
"react": "^16.14.0",
"react-dom": "^16.14.0",
"style-loader": "^0.23.1",
"url-loader": "^4.1.1",
"webpack": "^4.44.2",
"webpack-cli": "^3.3.11",
"webpack-dev-server": "^3.11.0",
"worker-loader": "^2.0.0"
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@material-ui/core": "^4.11.2",
"@material-ui/icons": "^4.11.2",
"crossfilter2": "^1.5.4",
"d3": "^6.3.1",
"d3-array": "^2.9.0",
"d3-axis": "^1.0.12",
"d3-fetch": "^1.1.2",
"d3-scale": "^2.2.2",
"d3-scale-chromatic": "^1.3.3",
"d3-selection": "^1.4.0",
"d3-shape": "^1.3.7",
"d3-transition": "^1.3.2",
"d3-zoom": "^1.8.3",
"dagre": "^0.8.4",
"everpolate": "0.0.3",
"install": "^0.12.2",
"jquery": "^3.5.1",
"lodash": "^4.17.20",
"npm": "^7.3.0",
"rc-checkbox": "^2.3.1",
"rc-select": "^11.5.3",
"rc-slider": "^9.6.5",
"react-bootstrap": "^1.4.0",
"react-redux": "^6.0.0",
"react-select": "^2.4.1",
"redux": "^4.0.1",
"redux-thunk": "^2.3.0",
"styled-components": "^5.2.1"
}
}
================================================
FILE: Examples/5_Webpack_BaseballAnnotator_Bidirectional/BaseballVisualizer/play_annotated.csv
================================================
time_elapsed_sec,P_x,P_y,B_x,B_y,R@1_x,R@1_y,R@2_x,R@2_y,R@3_x,R@3_y,1B_x,1B_y,2B_x,2B_y,3B_x,3B_y,SS_x,SS_y,LF_x,LF_y,CF_x,CF_y,RF_x,RF_y,C_x,C_y,BALL_x,BALL_y
0.0,-1.0465815337,62.2709968754,-2.2541642719,-2.9384709841,,,,,,,,,,,-72.29396308400649,91.01148815468284,-59.010552964461894,136.89963220401873,,,,,,,-2.2541642719,-6.5612191986,,
3.243,,,,,,,,,,,,,,,,,,,,,,,,,,,0.1207582738,62.7943023833
3.443,,,,,,,,,,,,,,,,,,,,,,,,,,,-1.0868244643,8.453079167
3.68,,,,,,,,,,,55.7098071589,96.0833135434,,,,,,,,,,,,,,,,
3.98,,,-1.0465815337,-2.9384709841,,,,,,,,,,,,,,,,,,,,,,,,
4.03,,,,,,,,,,,,,,,,,,,,,,,139.03301609056658,260.0730714943413,,,,
4.44,,,,,,,,,,,,,,,,,,,,,-16.74515712954728,316.82946018694093,,,,,,
4.47,,,,,,,,,,,,,,,,,,,-129.0503517766061,243.16691316037546,,,,,,,,
4.88,,,,,,,,,,,,,,,,,-42.10439463049605,136.89963220401873,,,,,,,,,,
5.493,,,,,,,,,,,,,,,,,,,,,,,,,,,31.5179094655,156.9857559583
5.81,,,,,,,,,,,64.1628863259,81.5923206857,,,,,,,,,,,,,,,,
6.34,,,,,,,,,,,,,,,,,,,,,,,128.16477144730283,217.8076756594267,,,,
6.57,,,,,,,,,,,,,,,,,,,-102.48353153751694,233.50625125525212,,,,,,,,
7.25,,,,,,,,,,,,,,,,,,,,,,,,,3.7837494188,-0.5233055079,,
7.383,,,,,,,,,,,,,,,,,,,,,,,,,,,61.707477919,65.2094678596
7.503,,,,,,,,,,,,,30.3103267273,156.9857559583,,,,,,,,,,,,,,
8.8,,,,,,,,,,,,,,,,,,,,,-33.65131546351312,249.20482685107754,,,,,,
8.81,,,,,,,,,,,,,,,,,-48.142308321198136,126.03138756075496,,,,,,,,,,
8.85,3.7837494188,52.6103349703,,,,,,,,,,,,,,,,,-102.48353153751694,214.18492744500543,,,,,,,,
8.89,,,62.9553035877,65.8937450899,,,,,,,64.1628863259,61.0634141373,,,,,,,,,,,131.78751966172408,180.37261077707376,,,,
8.893,,,,,,,,,,,,,38.7634058943,153.3630077438,,,,,,,,,,,,,,
================================================
FILE: Examples/5_Webpack_BaseballAnnotator_Bidirectional/BaseballVisualizer/webpack.config.js
================================================
const config = {
entry: ['./js/index.js'],
output: {
path: __dirname + '/build',
filename: 'baseballvisualizer.js',
library: 'baseballvisualizer'
},
module: {
rules: [
{
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/react']
}
},
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
},
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader'],
},
{
test: /\.(jpg|png|svg)$/,
loader: "url-loader",
options: {
limit: Infinity // everything
}
}
]
},
resolve: {
extensions: ['.js']
},
devServer:{
writeToDisk:true,
hot:false,
inline: false,
},
mode: 'development'
};
module.exports = config;
================================================
FILE: Examples/6_HelloWorld_Bidirectional/HelloWorld_Bidirectional.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "IaxAGrTGttuV"
},
"source": [
"# notebookJS Colab HelloWorld\n",
"\n",
"In this notebook, we show how to use notebookJS to run custom Javascript code. We also show how to send messages between Python and Javascript."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "vYD-yjPtn_ik"
},
"outputs": [],
"source": [
"!pip install notebookjs"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BjePMHoyt9TF"
},
"source": [
"## Defining the JavaScript drawing function.\n",
"\n",
"The function requests a message to python every 1 second. The callback identifier is called *get_hello*"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "10am7Nm9oCc9"
},
"outputs": [],
"source": [
"helloworld_js = \"\"\"\n",
"function helloworld(div_id, data){\n",
" comm = new CommAPI(\"get_hello\", (ret) => {\n",
" document.querySelector(div_id).textContent = ret.text;\n",
" });\n",
" setInterval(() => {comm.call({})}, 1000);\n",
" comm.call({});\n",
"}\n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zsXaw6XxuJF2"
},
"source": [
"## Defining the Python callback"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "L0ucikc4oIOW"
},
"outputs": [],
"source": [
"import random\n",
"def hello_world_random(data):\n",
" hello_world_languages = [\n",
" \"Ola Mundo\", # Portuguese\n",
" \"Hello World\", # English\n",
" \"Hola Mundo\", # Spanish\n",
" \"Geiá sou Kósme\", # Greek\n",
" \"Kon'nichiwa sekai\", # Japanese\n",
" \"Hallo Welt\", # German\n",
" \"namaste duniya\" #Hindi\n",
" ]\n",
" i = random.randint(0, len(hello_world_languages)-1)\n",
" return {'text': hello_world_languages[i]}"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "g-rkBdq7uXSL"
},
"source": [
"## Running the javascript function with Python callbacks"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "HaxtaaB-pj0z"
},
"outputs": [],
"source": [
"from notebookjs import execute_js\n",
"execute_js(helloworld_js, \"helloworld\", callbacks={\"get_hello\": hello_world_random})"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "848VKX8jqGbW"
},
"outputs": [],
"source": []
}
],
"metadata": {
"colab": {
"collapsed_sections": [],
"name": "HelloWorld_notebookJS_Colab.ipynb",
"provenance": []
},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
================================================
FILE: Examples/7_D3_scatterplot/D3_Scatter.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# D3 Scatter Plot"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"D3 V3 scatter plot. Code adapted from https://www.d3-graph-gallery.com/graph/scatter_animation_start.html"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Loading libraries"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"with open(\"scatterplot_lib.js\", \"r\") as f:\n",
" scatterplot_lib = f.read()\n",
" \n",
"d3_lib_url = \"https://d3js.org/d3.v3.min.js\"\n",
"\n",
"css = \"\"\"\n",
".axis path,\n",
".axis line {\n",
" fill: none;\n",
" stroke: slategray;\n",
" shape-rendering: crispEdges;\n",
"}\n",
"\"\"\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Loading data"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"data = pd.read_csv(\"Prices.csv\").to_dict(orient=\"records\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Plotting Scatter Plot"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"from notebookjs import execute_js\n",
"execute_js(library_list=[d3_lib_url, scatterplot_lib], main_function=\"scatter\", data_dict=data, css_list=css)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
================================================
FILE: Examples/7_D3_scatterplot/Prices.csv
================================================
GrLivArea,SalePrice
1710,208500
1262,181500
1786,223500
1717,140000
2198,250000
1362,143000
1694,307000
2090,200000
1774,129900
1077,118000
1040,129500
2324,345000
912,144000
1494,279500
1253,157000
854,132000
1004,149000
1296,90000
1114,159000
1339,139000
2376,325300
1108,139400
1795,230000
1060,129900
1060,154000
1600,256300
900,134800
1704,306000
1600,207500
520,68500
1317,40000
1228,149350
1234,179900
1700,165500
1561,277500
2452,309000
1097,145000
1297,153000
1057,109000
1152,82000
1324,160000
1328,170000
884,144000
938,130250
1150,141000
1752,319900
2149,239686
1656,249700
1452,113000
955,127000
1470,177000
1176,114500
816,110000
1842,385000
1360,130000
1425,180500
1739,172500
1720,196500
2945,438780
780,124900
1158,158000
1111,101000
1370,202500
1710,140000
2034,219500
2473,317000
2207,180000
1479,226000
747,80000
2287,225000
2223,244000
845,129500
1718,185000
1086,144900
1605,107400
988,91000
952,135750
1285,127000
1768,136500
1230,110000
2142,193500
1337,153500
1563,245000
1065,126500
1474,168500
2417,260000
1560,174000
1224,164500
1526,85000
990,123600
1040,109900
1235,98600
964,163500
2291,133900
1786,204750
1470,185000
1588,214000
960,94750
835,83000
1225,128950
1610,205000
1732,178000
1535,118964
1226,198900
1818,169500
1992,250000
1047,100000
789,115000
1517,115000
1844,190000
1855,136900
1430,180000
2696,383970
2259,217000
2320,259500
1458,176000
1092,139000
1125,155000
3222,320000
1456,163990
988,180000
1123,100000
1080,136000
1199,153900
1586,181000
754,84500
958,128000
840,87000
1348,155000
1053,150000
2157,226000
2054,244000
1327,150750
1296,220000
1721,180000
1682,174000
1214,143000
1959,171000
1852,230000
1764,231500
864,115000
1734,260000
1385,166000
1501,204000
1728,125000
1709,130000
875,105000
2035,222500
1080,141000
1344,115000
969,122000
1710,372402
1993,190000
1252,235000
1200,125000
1096,79000
1040,109500
1968,269500
1947,254900
2462,320000
1232,162500
2668,412500
1541,220000
882,103200
1616,152000
1355,127500
1867,190000
2161,325624
1720,183500
1707,228000
1382,128500
1656,215000
1767,239000
1362,163000
1651,184000
2158,243000
2060,211000
1920,172500
2234,501837
968,100000
1525,177000
1802,200100
1340,120000
2082,200000
1252,127000
3608,475000
1217,173000
1656,135000
1224,153337
1593,286000
2727,315000
1479,184000
1431,192000
1709,130000
864,127000
1456,148500
1726,311872
3112,235000
2229,104000
1713,274900
1121,140000
1279,171500
1310,112000
848,149000
1284,110000
1442,180500
1696,143900
1100,141000
2062,277000
1092,145000
864,98000
1212,186000
1852,252678
990,156000
1392,161750
1236,134450
1436,210000
1328,107000
1954,311500
1248,167240
1498,204900
2267,200000
1552,179900
864,97000
2392,386250
1302,112000
2520,290000
987,106000
912,125000
1555,192500
1194,148000
2794,403000
987,94500
894,128200
1960,216500
987,89500
1414,185500
1744,194500
1694,318000
1487,113000
1566,262500
866,110500
1440,79000
1217,120000
2110,205000
1872,241500
1928,137000
1375,140000
1668,180000
2144,277000
1306,76500
1625,235000
1640,173000
1302,158000
1314,145000
2291,230000
1728,207500
1604,220000
1792,231500
882,97000
1382,176000
2574,276000
1212,151000
1316,130000
764,73000
1422,175500
1511,185000
2192,179500
778,120500
1113,148000
1939,266000
1363,241500
2270,290000
1632,139000
816,124500
1548,205000
1560,201000
864,141000
2121,415298
2022,192000
1982,228500
1262,185000
1314,207500
1468,244600
1575,179200
1250,164700
1734,159000
858,88000
900,122000
1396,153575
1919,233230
1716,135900
1716,131000
2263,235000
1644,167000
1003,142500
1558,152000
1950,239000
1743,175000
1152,158500
1336,157000
2452,267000
1541,205000
894,149900
3493,295000
2000,305900
2243,225000
1406,89500
861,82500
1944,360000
1501,165600
972,132000
1118,119900
2036,375000
1641,178000
1432,188500
2353,260000
1959,270000
2646,260000
1472,187500
2596,342643
2468,354000
2730,301000
1163,126175
2978,242000
803,87000
1719,324000
1383,145250
2134,214500
1192,78000
1728,119000
1056,139000
1629,284000
1358,207000
1638,192000
1786,228950
1922,377426
1536,214000
1621,202500
1215,155000
1908,202900
841,82000
1040,87500
1684,266000
1112,85000
1577,140200
958,151500
1478,157500
1626,154000
2728,437154
1869,318061
1453,190000
1111,95000
720,105900
1595,140000
1200,177500
1167,173000
1142,134000
1352,130000
1924,280000
912,156000
1505,145000
1922,198500
987,118000
1574,190000
1344,147000
1394,159000
1431,165000
1268,132000
1287,162000
1664,172400
1588,134432
752,125000
1319,123000
1928,219500
904,61000
914,148000
2466,340000
1856,394432
1800,179000
1691,127000
1301,187750
1797,213500
784,76000
1953,240000
1269,192000
1184,81000
1125,125000
1479,191000
2332,426000
1367,119000
1961,215000
882,106500
788,100000
1034,109000
1144,129000
894,123000
1812,169500
1077,67000
1550,241000
1288,245500
1310,164990
672,108000
2263,258000
1572,168000
1620,150000
1639,115000
1680,177000
2172,280000
2078,339750
1276,60000
1056,145000
1478,222000
1028,115000
2097,228000
1340,181134
1400,149500
2624,239000
1134,126000
1056,142000
1344,206300
1602,215000
988,113000
2630,315000
1196,139000
1389,135000
1644,275000
907,109008
1208,195400
1412,175000
987,85400
1198,79900
1365,122500
1604,181000
630,81000
1661,212000
1118,116000
904,119000
694,90350
1196,110000
2402,555000
1440,118000
1573,162900
1258,172500
1908,210000
1689,127500
1888,190000
1886,199900
1376,119500
1183,120000
813,110000
1533,280000
1756,204000
1590,210000
1728,188000
1242,175500
1344,98000
1663,256000
1666,161000
1203,110000
1935,263435
1135,155000
864,62383
1660,188700
1040,124000
1414,178740
1277,167000
1644,146500
1634,250000
1710,187000
1502,212000
1969,190000
1072,148000
1976,440000
1652,251000
970,132500
1493,208900
2643,380000
1718,297000
1131,89471
1850,326000
1792,374000
1826,155000
1216,164000
999,132500
1113,147000
1073,156000
1484,175000
2414,160000
630,86000
1304,115000
1578,133000
1456,172785
1269,155000
886,91300
720,34900
3228,430000
1820,184000
899,130000
912,120000
1218,113000
1768,226700
1214,140000
1801,289000
1322,147000
1960,124500
1911,215000
1218,208300
1378,161000
1041,124500
1363,164900
1368,202665
864,129900
1080,134000
789,96500
2020,402861
2119,158000
2344,265000
1796,211000
2080,234000
1294,106250
1244,150000
1664,159000
4676,184750
2398,315750
1266,176000
928,132000
2713,446261
605,86000
2515,200624
1509,175000
1362,128000
827,107500
334,39300
1414,178000
1347,107500
1724,188000
864,111250
1159,158000
1601,272000
1838,315000
2285,248000
1680,213250
767,133000
1496,179665
2183,229000
1635,210000
768,129500
825,125000
2094,263000
1069,140000
928,112500
1717,255500
1126,108000
2046,284000
1048,113000
1092,141000
1336,108000
1446,175000
1557,234000
1392,121500
1389,170000
996,108000
1674,185000
2295,268000
1647,128000
2504,325000
1535,214000
2132,316600
943,135960
1728,142600
864,120000
1692,224500
1430,170000
1109,139000
1216,118500
1477,145000
1320,164500
1392,146000
1795,131500
1429,181900
2042,253293
816,118500
2775,325000
1573,133000
2028,369900
838,130000
860,137000
1473,143000
935,79500
1582,185900
2296,451950
816,138000
848,140000
924,110000
1826,319000
1368,114504
1402,194201
1647,217500
1556,151000
1904,275000
1375,141000
1915,220000
1200,151000
1494,221000
1986,205000
1040,152000
2008,225000
3194,359100
1029,118500
2153,313000
1032,148000
1872,261500
1120,147000
630,75500
1054,137500
1509,183200
832,105500
1828,314813
2262,305000
864,67000
2614,240000
980,135000
1512,168500
1790,165150
1116,160000
1422,139900
1520,153000
2080,135000
1350,168500
1750,124000
1554,209500
1411,82500
1056,139400
1056,144000
3395,200000
800,60000
1387,93000
796,85000
1567,264561
1518,274000
1929,226000
2704,345000
1620,152000
1766,370878
981,143250
1048,98300
1094,155000
1839,155000
630,84500
1665,205950
1510,108000
1716,191000
1469,135000
2113,350000
1092,88000
1053,145500
1502,149000
1458,97500
1486,167000
1935,197900
2448,402000
1392,110000
1181,137500
2097,423000
1936,230500
2380,129000
1679,193500
1437,168000
1180,137500
1476,173500
1369,103600
1208,165000
1839,257500
1136,140000
1441,148500
1774,87000
792,109500
2046,372500
988,128500
923,143000
1520,159434
1291,173000
1668,285000
1839,221000
2090,207500
1761,227875
1102,148800
1419,392000
1362,194700
848,141000
4316,755000
2519,335000
1073,108480
1539,141500
1137,176000
616,89000
1148,123500
894,138500
1391,196000
1800,312500
1164,140000
2576,361919
1812,140000
1484,213000
1092,55000
1824,302000
1324,254000
1456,179540
904,109900
729,52000
1178,102776
1228,189000
960,129000
1479,130500
1350,165000
2554,159500
1178,157000
2418,341000
971,128500
1742,275000
848,143000
864,124500
1470,135000
1698,320000
864,120500
1680,222000
1232,194500
1776,110000
1208,103000
1616,236500
1146,187500
2031,222500
1144,131400
948,108000
1768,163000
1040,93500
1801,239900
1200,179000
1728,190000
1432,132000
912,142000
1349,179000
1464,175000
1337,180000
2715,299800
2256,236000
2640,265979
1720,260400
1529,98000
1140,96500
1320,162000
1494,217000
2098,275500
1026,156000
1471,172500
1768,212000
1386,158900
1501,179400
2531,290000
864,127500
1301,100000
1547,215200
2365,337000
1494,270000
1506,264132
1714,196500
1750,160000
1836,216837
3279,538000
858,134900
1220,102000
1117,107000
912,114500
1973,395000
1204,162000
1614,221500
894,142500
2020,144000
1004,135000
1253,176000
1603,175900
1430,187100
1110,165500
1484,128000
1342,161500
1652,139000
2084,233000
901,107900
2087,187500
1145,160200
1062,146800
2013,269790
1496,225000
1895,194500
1564,171000
1285,143500
773,110000
3140,485000
1768,175000
1688,200000
1196,109900
1456,189000
2822,582933
1128,118000
1428,227680
980,135500
1576,223500
1086,159950
2138,106000
1309,181000
848,144500
1044,55993
1442,157900
1250,116000
1661,224900
1008,137000
1689,271000
1052,155000
1358,224000
1640,183000
936,93000
1733,225000
1489,139500
1489,232600
2084,385000
784,109500
1434,189000
2126,185000
1223,147400
1392,166000
1200,151000
1829,237000
1516,167000
1144,139950
1067,128000
1559,153500
987,100000
1099,144000
1200,130500
1482,140000
1539,157500
1165,174900
1800,141000
1416,153900
1701,171000
1775,213000
864,133500
2358,240000
1855,187000
848,131500
1456,215000
1646,164000
1445,158000
1779,170000
1040,127000
1026,147000
1481,174000
1370,152000
2654,250000
1426,189950
1039,131500
1097,152000
1148,132500
1372,250580
1002,148500
1646,248900
1120,129000
2320,169000
1949,236000
894,109500
1682,200500
910,116000
1268,133000
1131,66500
2610,303477
1040,132250
2224,350000
1155,148000
864,136500
1090,157000
1717,187500
1593,178000
2230,118500
892,100000
1709,328900
1712,145000
1393,135500
2217,268000
1505,149500
924,122900
1683,172500
1068,154500
1383,165000
1535,118858
1796,140000
951,106500
2240,142953
2364,611657
1236,135000
858,110000
1306,153000
1509,180000
1670,240000
902,125500
1063,128000
1636,255000
2057,250000
902,131000
1484,174000
2274,154300
1268,143500
1015,88000
2002,145000
1224,173733
1092,75000
480,35311
1229,135000
2127,238000
1414,176500
1721,201000
2200,145900
1316,169990
1617,193000
1686,207500
1126,175000
2374,285000
1978,176000
1788,236500
2236,222000
1466,201000
925,117500
1905,320000
1500,190000
2069,242000
747,79900
1200,184900
1971,253000
1962,239799
2403,244400
1728,150900
2060,214000
1440,150000
1632,143000
1344,137500
1869,124900
1144,143000
1629,270000
1776,192500
1381,197500
864,129000
965,119900
768,133900
1968,172000
980,127500
1958,145000
1229,124000
1057,132000
1337,185000
1416,155000
858,116500
2872,272000
1548,155000
1800,239000
1894,214900
1484,178900
1308,160000
1098,135000
968,37900
1095,140000
1192,135000
1626,173000
918,99500
1428,182000
2019,167500
1382,165000
869,85500
1241,199900
894,110000
1121,139000
999,178400
2612,336000
1266,159895
2290,255900
1734,126000
1164,125000
1635,117000
1940,395192
2030,195000
1576,197000
2392,348000
1742,168000
1851,187000
1500,173900
1718,337500
1230,121600
1050,136500
1442,185000
1077,91000
1208,206000
944,82000
691,86000
1574,232000
1680,136905
1504,181000
985,149900
1657,163500
1092,88000
1710,240000
1522,102000
1271,135000
1664,100000
1502,165000
1022,85000
1082,119200
1665,227000
1504,203000
1360,187500
1472,160000
1506,213490
1132,176000
1220,194000
1248,87000
1504,191000
2898,287000
882,112500
1264,167500
1646,293077
1376,105000
1218,118000
1928,160000
3082,197000
2520,310000
1654,230000
954,119750
845,84000
1620,315500
2263,287000
1344,97000
630,80000
1803,155000
1632,173000
1306,196000
2329,262280
2524,278000
1733,139600
2868,556581
990,145000
1771,115000
930,84900
1302,176485
1316,200141
1977,165000
1526,144500
1989,255000
1523,180000
1364,185850
1850,248000
2184,335000
1991,220000
1338,213500
894,81000
2337,90000
1103,110500
1154,154000
2260,328000
1571,178000
1611,167900
2521,151400
893,135000
1048,135000
1556,154000
1456,91500
1426,159500
1240,194000
1740,219500
1466,170000
1096,138800
848,155900
990,126000
1258,145000
1040,133000
1459,192000
1251,160000
1498,187500
996,147000
1092,83500
1953,252000
1709,137500
1247,197000
1040,92900
1252,160000
1694,136500
1200,146000
936,129000
1314,176432
1355,127000
1088,170000
1324,128000
1601,157000
438,60000
950,119500
1134,135000
1194,159500
1302,106000
2622,325000
1442,179900
2021,274725
1690,181000
1836,280000
1658,188000
1964,205000
816,129900
1008,134500
833,117000
1734,318000
1419,184100
894,130000
1601,140000
1040,133700
1012,118400
1552,212900
960,112000
698,118000
1482,163900
1005,115000
1555,174000
1530,259000
1959,215000
936,140000
1981,135000
974,93500
2210,117500
2020,239500
1600,169000
986,102000
1252,119000
1020,94000
1567,196000
1167,144000
952,139000
1868,197500
2828,424870
1006,80000
924,80000
1576,149000
1298,180000
1564,174500
1111,116900
1482,143000
932,124000
1466,149900
1811,230000
816,120500
1820,201800
1437,218000
1265,179900
1314,230000
1580,235128
1876,185000
1456,146000
1640,224000
894,129000
1258,108959
1432,194000
1502,233170
1694,245350
1671,173000
2108,235000
3627,625000
1118,171000
1261,163000
1250,171900
3086,200500
2345,239000
2872,285000
923,119500
1224,115000
1343,154900
1124,93000
2514,250000
1652,392500
4476,745000
1130,120000
1572,186700
1221,104900
1699,95000
1624,262000
1660,195000
1804,189000
1622,168000
1441,174000
1472,125000
1224,165000
1352,158000
1456,176000
1863,219210
1690,144000
1212,178000
1382,148000
864,116050
1779,197900
1348,117000
1630,213000
1074,153500
2196,271900
1056,107000
1700,200000
1283,140000
1660,290000
1845,189000
1752,164000
672,113000
960,145000
999,134500
894,125000
1902,112000
1314,229456
912,80500
1218,91500
912,115000
1211,134000
1846,143000
2136,137900
1490,184000
1138,145000
1933,214000
912,147000
1702,367294
1507,127000
2620,190000
1190,132500
1224,101800
1188,142000
1964,130000
1784,138887
1626,175500
1948,195000
1141,142500
1484,265900
1768,224900
1689,248328
1173,170000
2076,465000
1517,230000
1868,178000
1553,186500
1034,169900
2058,129500
988,119000
2110,244000
1405,171750
874,130000
2167,294000
1656,165400
1367,127500
1987,301500
864,99900
1166,190000
1054,151000
1675,181000
1050,128900
1788,161500
1824,180500
1337,181000
1452,183900
1889,122000
2018,378500
3447,381000
1524,144000
1524,260000
1489,185750
935,137000
1357,177000
1250,139000
1920,137000
1395,162000
1724,197900
2031,237000
1128,68400
1573,227000
1339,180000
1040,150500
1824,139000
2447,169000
1412,132500
1328,143000
1582,190000
1659,278000
1970,281000
1152,180500
1302,119500
2372,107500
1664,162900
864,115000
1052,138500
1128,155000
1072,140000
5642,160000
1246,154000
1983,225000
1494,177500
2526,290000
1616,232000
1708,130000
1652,325000
1368,202500
990,138000
1122,147000
1294,179200
1902,335000
1274,203000
2810,302000
2599,333168
948,119000
2112,206900
1630,295493
1352,208900
1787,275000
948,111000
1478,156500
720,72500
1923,190000
708,82500
1795,147000
796,55000
774,79000
816,130500
2792,256000
1632,176500
1588,227000
954,132500
816,100000
1360,125500
1365,125000
1334,167900
1656,135000
693,52500
1861,200000
864,128500
872,123000
1114,155000
2169,228500
1913,177000
1456,155835
960,108500
2156,262500
1776,283463
1494,215000
2358,122000
2634,200000
1716,171000
1176,134900
3238,410000
1865,235000
1920,170000
892,110000
1078,149900
1573,177500
1980,315000
2601,189000
1530,260000
1738,104900
1412,156932
1200,144152
1674,216000
1790,193000
1475,127000
848,144000
1668,232000
1374,105000
1661,165500
2097,274300
2633,466500
1958,250000
1571,239000
790,91000
1604,117000
987,83000
1394,167500
864,58500
2117,237500
1762,157000
1416,112000
1258,105000
1154,125500
2784,250000
2526,136000
1746,377500
1218,131000
1525,235000
1584,124000
900,123000
1912,163000
1500,246578
2482,281213
1687,160000
1513,137500
1904,138000
1608,137450
1158,120000
1593,193000
1294,193879
1464,282922
1214,105000
1646,275000
768,133000
833,112000
1363,125500
2093,215000
1840,230000
1668,140000
1040,90000
1844,257000
1848,207000
1569,175900
2290,122500
2450,340000
1144,124000
1844,223000
1416,179900
1069,127500
848,136500
2201,274970
1344,144000
1252,142000
2127,271000
1558,140000
804,119000
1440,182900
1838,192140
958,143750
968,64500
1792,186500
1126,160000
1537,174000
864,120500
1932,394617
1236,149700
1725,197000
2555,191000
848,149300
2007,310000
952,121000
1422,179600
913,129000
1188,157900
2090,240000
1346,112000
630,92000
1792,136000
1578,287090
1072,145000
1140,84500
1221,185000
1647,175000
2073,210000
2340,266500
1078,142125
1256,147500
================================================
FILE: Examples/7_D3_scatterplot/scatterplot_lib.js
================================================
function scatter(div_id, data){
// Code adapted from https://www.d3-graph-gallery.com/graph/scatter_animation_start.html
// Dataset https://raw.githubusercontent.com/holtzy/data_to_viz/master/Example_dataset/2_TwoNum.csv
// set the dimensions and margins of the graph
var margin = {top: 10, right: 30, bottom: 30, left: 60},
width = 460 - margin.left - margin.right,
height = 400 - margin.top - margin.bottom;
// append the svg object to the body of the page
var svg = d3.select(div_id)
.append("svg")
.attr("width", width + margin.left + margin.right)
.attr("height", height + margin.top + margin.bottom)
.append("g")
.attr("transform",
"translate(" + margin.left + "," + margin.top + ")")
// Add X axis
var x = d3.scale.linear()
.domain([0, 0])
.range([ 0, width ]);
svg.append("g")
.attr("class", "myXaxis axis") // Note that here we give a class to the X axis, to be able to call it later and modify it
.attr("transform", "translate(0," + height + ")")
.call(d3.svg.axis().scale(x))
.attr("opacity", "0")
// Add Y axis
var y = d3.scale.linear()
.domain([0, 500000])
.range([ height, 0]);
svg.append("g")
.attr("class", "axis")
.call(d3.svg.axis()
.orient('left')
.scale(y));
// Add dots
svg.append('g')
.selectAll("dot")
.data(data)
.enter()
.append("circle")
.attr("cx", function (d) { return x(d.GrLivArea); } )
.attr("cy", function (d) { return y(d.SalePrice); } )
.attr("r", 1.5)
.style("fill", "#69b3a2")
// new X axis
x.domain([0, 4000])
svg.select(".myXaxis")
.transition()
.duration(2000)
.attr("opacity", "1")
.call(d3.svg.axis().scale(x));
svg.selectAll("circle")
.transition()
.delay(function(d,i){return(i*3)})
.duration(2000)
.attr("cx", function (d) { return x(d.GrLivArea); } )
.attr("cy", function (d) { return y(d.SalePrice); } )
}
================================================
FILE: Images/notebookJS.ai
================================================
%PDF-1.5
%
1 0 obj
<</Metadata 2 0 R/OCProperties<</D<</ON[23 0 R]/Order 24 0 R/RBGroups[]>>/OCGs[23 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 49856/Subtype/XML/Type/Metadata>>stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 6.0-c002 79.164360, 2020/02/13-01:07:22 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:xmp="http://ns.adobe.com/xap/1.0/"
xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/"
xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/"
xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"
xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/"
xmlns:pdf="http://ns.adobe.com/pdf/1.3/"
xmlns:pdfx="http://ns.adobe.com/pdfx/1.3/">
<dc:format>application/pdf</dc:format>
<dc:title>
<rdf:Alt>
<rdf:li xml:lang="x-default">notebookJS</rdf:li>
</rdf:Alt>
</dc:title>
<xmp:CreatorTool>Adobe Illustrator 24.1 (Macintosh)</xmp:CreatorTool>
<xmp:CreateDate>2021-04-12T12:26:13-04:00</xmp:CreateDate>
<xmp:ModifyDate>2021-04-12T12:26:14-04:00</xmp:ModifyDate>
<xmp:MetadataDate>2021-04-12T12:26:14-04:00</xmp:MetadataDate>
<xmp:Thumbnails>
<rdf:Alt>
<rdf:li rdf:parseType="Resource">
<xmpGImg:width>212</xmpGImg:width>
<xmpGImg:height>256</xmpGImg:height>
<xmpGImg:format>JPEG</xmpGImg:format>
<xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADUAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4qx/8AMP8A5QDzN/2y
r7/qGfFXxh+SX/OO/wDys/Qb/Vv8Qfoj6jdfVfR+p/Wef7tZOXL14KfbpSmKvRf+hGP+/wBv+5X/
ANnmKu/6EY/7/b/uV/8AZ5irv+hGP+/2/wC5X/2eYq7/AKEY/wC/2/7lf/Z5irv+hGP+/wBv+5X/
ANnmKu/6EY/7/b/uV/8AZ5irv+hGP+/2/wC5X/2eYq7/AKEY/wC/2/7lf/Z5irv+hGP+/wBv+5X/
ANnmKu/6EY/7/b/uV/8AZ5irv+hGP+/2/wC5X/2eYq7/AKEY/wC/2/7lf/Z5irv+hGP+/wBv+5X/
ANnmKu/6EY/7/b/uV/8AZ5irv+hGP+/2/wC5X/2eYq7/AKEY/wC/2/7lf/Z5irv+hGP+/wBv+5X/
ANnmKu/6EY/7/b/uV/8AZ5irv+hGP+/2/wC5X/2eYq7/AKEY/wC/2/7lf/Z5irv+hGP+/wBv+5X/
ANnmKu/6EY/7/b/uV/8AZ5irv+hGP+/2/wC5X/2eYq+Xvqf+5L6lz/3d6PqU/wArjWlf44q/UvFW
P/mH/wAoB5m/7ZV9/wBQz4q8U/5wl/5QPXv+2p/2Lx4q+i8VdirsVdirsVdirsVdirsVdirsVdir
sVdirsVdirsVdirsVdirsVdirsVfl9/00n/R5/zNxV9L/wDK3v8AnLj/AKkr/uWXP/VXFUv8w/mr
/wA5TXWganban5P9DTZ7SeO+n/RtwnCB42WVuRkIXihJrirCPyU88fnZ5f0K/tvIGgnVtOmuvUu5
hZy3XGf01XjyjZQPgANMVei/8rf/AOcuP+pMb/uFXP8A1UxV9A/lZrHm7WPIemal5vsv0f5in9f6
9ZmJoOHC4kSL925Zl5RKrde9cVZXirEL78z9Asr24s5be7aW2leFyqRlS0bFTSsgNKjFVD/lbXlz
/lmvP+Ai/wCqmKu/5W15c/5Zrz/gIv8Aqpirv+VteXP+Wa8/4CL/AKqYq7/lbXlz/lmvP+Ai/wCq
mKu/5W15c/5Zrz/gIv8Aqpirv+VteXP+Wa8/4CL/AKqYq7/lbXlz/lmvP+Ai/wCqmKu/5W15c/5Z
rz/gIv8Aqpirv+VteXP+Wa8/4CL/AKqYq7/lbXlz/lmvP+Ai/wCqmKu/5W15c/5Zrz/gIv8Aqpir
v+VteXP+Wa8/4CL/AKqYq7/lbXlz/lmvP+Ai/wCqmKu/5W15c/5Zrz/gIv8Aqpirv+VteXP+Wa8/
4CL/AKqYq7/lbXlz/lmvP+Ai/wCqmKqtr+aXl+5uobaO3uw87rGhZI6AuQorSQ+OKsxxV2Kvy+/6
aT/o8/5m4q/UHFWP/mH/AMoB5m/7ZV9/1DPirxT/AJwl/wCUD17/ALan/YvHir6LxV2KuxV4D5l/
5SPVf+Yy4/5OtiqW4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUdof/AB2tP/5iYf8Ak4MV
fQWKuxV+X3/TSf8AR5/zNxV+oOKsf/MP/lAPM3/bKvv+oZ8VeKf84S/8oHr3/bU/7F48VfReKuxV
2KvCfMen37+YdUZbaVla7nKsEYggytuNsVS79G6j/wAss3/Itv6Yq79G6j/yyzf8i2/pirv0bqP/
ACyzf8i2/pirv0bqP/LLN/yLb+mKu/Ruo/8ALLN/yLb+mKu/Ruo/8ss3/Itv6Yq79G6j/wAss3/I
tv6Yq79G6j/yyzf8i2/pirv0bqP/ACyzf8i2/pirv0bqP/LLN/yLb+mKu/Ruo/8ALLN/yLb+mKu/
Ruo/8ss3/Itv6Yq79G6j/wAss3/Itv6Yq79G6j/yyzf8i2/pirv0bqP/ACyzf8i2/pirv0bqP/LL
N/yLb+mKo3RdPv11mwZraUKLiIklGAADj2xV71irsVfl9/00n/R5/wAzcVfS/wCn/wDnNr/q2/8A
JHTP64ql/mHXP+cxn0DU01fT+OlNaTjUG9HThS3MbCU1U8vsV6b4qwj8lNT/AOcgbTQr9Py0tjPp
bXVb1hFaSUuPTUUrcfF9jj02xV6L/iD/AJza/wCre3/SPpn9cVfQP5WXHne48h6ZN54j9LzQ3r/p
CMrElKXEgi+GH93/AHITp+vFWV4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX
Yq/L7/ppP+jz/mbir9QcVY/+Yf8AygHmb/tlX3/UM+KvFP8AnCX/AJQPXv8Atqf9i8eKvovFXYq7
FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX5ff9NJ/0ef8AM3FX6g4qx/8A
MP8A5QDzN/2yr7/qGfFXin/OEv8Aygevf9tT/sXjxV9F4q7FXYq8R806vq0XmPUo4724SNLiQKiy
uAAGOwAOKpX+nNa/6uFz/wAjpP64q79Oa1/1cLn/AJHSf1xV36c1r/q4XP8AyOk/rirv05rX/Vwu
f+R0n9cVd+nNa/6uFz/yOk/rirv05rX/AFcLn/kdJ/XFXfpzWv8Aq4XP/I6T+uKu/Tmtf9XC5/5H
Sf1xV36c1r/q4XP/ACOk/rirv05rX/Vwuf8AkdJ/XFXfpzWv+rhc/wDI6T+uKu/Tmtf9XC5/5HSf
1xV36c1r/q4XP/I6T+uKu/Tmtf8AVwuf+R0n9cVd+nNa/wCrhc/8jpP64q79Oa1/1cLn/kdJ/XFV
S31vWTcRA39yQXWo9aTx+eKvfsVdir8vv+mk/wCjz/mbir6X/QH/ADm1/wBXL/ktpn9MVS/zDof/
ADmMmgam+r6hy0pbSc6gvraca24jYyiijl9ivTfFWEfkppn/ADkDd6Ffv+WlyYNLW6peqJbSOtx6
amtLj4vscem2KvRf8P8A/ObX/Vwb/pI0z+mKvoH8rLfzvb+Q9Mh88Ser5oX1/wBISFonrW4kMXxQ
/u/7kp0/XirK8VeDebf+Un1T/mJk/wCJHFUoxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kq
tt/vRF/rr+vFX0XirsVfl9/00n/R5/zNxV+oOKsf/MP/AJQDzN/2yr7/AKhnxV4p/wA4S/8AKB69
/wBtT/sXjxV9F4q7FXYqxLUfyz0G/v572ae6WW4dpHVHjCgsamlYyfxxVDf8ql8uf8tN5/wcX/VP
FXf8ql8uf8tN5/wcX/VPFXf8ql8uf8tN5/wcX/VPFXf8ql8uf8tN5/wcX/VPFXf8ql8uf8tN5/wc
X/VPFXf8ql8uf8tN5/wcX/VPFXf8ql8uf8tN5/wcX/VPFXf8ql8uf8tN5/wcX/VPFXf8ql8uf8tN
5/wcX/VPFXf8ql8uf8tN5/wcX/VPFXf8ql8uf8tN5/wcX/VPFXf8ql8uf8tN5/wcX/VPFXf8ql8u
f8tN5/wcX/VPFXf8ql8uf8tN5/wcX/VPFXf8ql8uf8tN5/wcX/VPFXf8ql8uf8tN5/wcX/VPFVyf
lP5dR1cXN5VSCKvF2/554qzTFXYq/L7/AKaT/o8/5m4q/UHFWP8A5h/8oB5m/wC2Vff9Qz4q8U/5
wl/5QPXv+2p/2Lx4q+i8VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV
fl9/00n/AEef8zcVfS//ACqH/nLj/qdf+5nc/wDVLFUv8w/lV/zlNa6BqdzqfnD19NgtJ5L6D9JX
D84EjZpV4mMBuSAimKsI/JTyP+dnmDQr+58ga8dJ06G69O7hF5La8p/TVuXGNWB+AgVxV6L/AMqg
/wCcuP8Aqc2/7itz/wBU8VfQP5WaP5u0fyHpmm+b739IeYoPX+vXhlafnzuJHi/eOFZuMTKvTtTF
WV4q881T81biy1O7shpyOLaaSEOZSOXpuVrTj3pnO5+3JQnKPD9JI59z02n9n45McZ8f1AHl3j3o
X/lcN1/1bE/5Gn/mnKv9EEv5g+f7G3/Q3H+efl+13/K4br/q2J/yNP8AzTj/AKIJfzB8/wBi/wCh
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
fwxV/9k=</xmpGImg:image>
</rdf:li>
</rdf:Alt>
</xmp:Thumbnails>
<xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
<xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
<xmpMM:DocumentID>xmp.did:70590589-948d-4756-b92d-228cc83a97cb</xmpMM:DocumentID>
<xmpMM:InstanceID>uuid:8609d199-ee6e-8340-9c4a-35637fac439b</xmpMM:InstanceID>
<xmpMM:DerivedFrom rdf:parseType="Resource">
<stRef:instanceID>uuid:27f584af-a488-9349-a64a-b29a9af20ed9</stRef:instanceID>
<stRef:documentID>xmp.did:8d08eb9c-7571-4e78-aade-d88bdc677e5e</stRef:documentID>
<stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
<stRef:renditionClass>proof:pdf</stRef:renditionClass>
</xmpMM:DerivedFrom>
<xmpMM:History>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<stEvt:action>saved</stEvt:action>
<stEvt:instanceID>xmp.iid:70590589-948d-4756-b92d-228cc83a97cb</stEvt:instanceID>
<stEvt:when>2021-04-12T10:58:21-04:00</stEvt:when>
<stEvt:softwareAgent>Adobe Illustrator 24.1 (Macintosh)</stEvt:softwareAgent>
<stEvt:changed>/</stEvt:changed>
</rdf:li>
</rdf:Seq>
</xmpMM:History>
<illustrator:StartupProfile>Web</illustrator:StartupProfile>
<illustrator:Type>Document</illustrator:Type>
<illustrator:CreatorSubTool>AIRobin</illustrator:CreatorSubTool>
<xmpTPg:NPages>1</xmpTPg:NPages>
<xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
<xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
<xmpTPg:MaxPageSize rdf:parseType="Resource">
<stDim:w>461.000000</stDim:w>
<stDim:h>443.000000</stDim:h>
<stDim:unit>Pixels</stDim:unit>
</xmpTPg:MaxPageSize>
<xmpTPg:Fonts>
<rdf:Bag>
<rdf:li rdf:parseType="Resource">
<stFnt:fontName>MyriadPro-Regular</stFnt:fontName>
<stFnt:fontFamily>Myriad Pro</stFnt:fontFamily>
<stFnt:fontFace>Regular</stFnt:fontFace>
<stFnt:fontType>Open Type</stFnt:fontType>
<stFnt:versionString>Version 2.106;PS 2.000;hotconv 1.0.70;makeotf.lib2.5.58329</stFnt:versionString>
<stFnt:composite>False</stFnt:composite>
<stFnt:fontFileName>MyriadPro-Regular.otf</stFnt:fontFileName>
</rdf:li>
</rdf:Bag>
</xmpTPg:Fonts>
<xmpTPg:PlateNames>
<rdf:Seq>
<rdf:li>Cyan</rdf:li>
<rdf:li>Magenta</rdf:li>
<rdf:li>Yellow</rdf:li>
<rdf:li>Black</rdf:li>
</rdf:Seq>
</xmpTPg:PlateNames>
<xmpTPg:SwatchGroups>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<xmpG:groupName>Default Swatch Group</xmpG:groupName>
<xmpG:groupType>0</xmpG:groupType>
<xmpG:Colorants>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>White</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>255</xmpG:red>
<xmpG:green>255</xmpG:green>
<xmpG:blue>255</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>Black</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>0</xmpG:red>
<xmpG:green>0</xmpG:green>
<xmpG:blue>0</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>RGB Red</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>255</xmpG:red>
<xmpG:green>0</xmpG:green>
<xmpG:blue>0</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>RGB Yellow</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>255</xmpG:red>
<xmpG:green>255</xmpG:green>
<xmpG:blue>0</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>RGB Green</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>0</xmpG:red>
<xmpG:green>255</xmpG:green>
<xmpG:blue>0</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>RGB Cyan</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>0</xmpG:red>
<xmpG:green>255</xmpG:green>
<xmpG:blue>255</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>RGB Blue</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>0</xmpG:red>
<xmpG:green>0</xmpG:green>
<xmpG:blue>255</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>RGB Magenta</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>255</xmpG:red>
<xmpG:green>0</xmpG:green>
<xmpG:blue>255</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>193</xmpG:red>
<xmpG:green>39</xmpG:green>
<xmpG:blue>45</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>237</xmpG:red>
<xmpG:green>28</xmpG:green>
<xmpG:blue>36</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>241</xmpG:red>
<xmpG:green>90</xmpG:green>
<xmpG:blue>36</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>247</xmpG:red>
<xmpG:green>147</xmpG:green>
<xmpG:blue>30</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>251</xmpG:red>
<xmpG:green>176</xmpG:green>
<xmpG:blue>59</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>252</xmpG:red>
<xmpG:green>238</xmpG:green>
<xmpG:blue>33</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>217</xmpG:red>
<xmpG:green>224</xmpG:green>
<xmpG:blue>33</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>140</xmpG:red>
<xmpG:green>198</xmpG:green>
<xmpG:blue>63</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>57</xmpG:red>
<xmpG:green>181</xmpG:green>
<xmpG:blue>74</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>0</xmpG:red>
<xmpG:green>146</xmpG:green>
<xmpG:blue>69</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>0</xmpG:red>
<xmpG:green>104</xmpG:green>
<xmpG:blue>55</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>34</xmpG:red>
<xmpG:green>181</xmpG:green>
<xmpG:blue>115</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>0</xmpG:red>
<xmpG:green>169</xmpG:green>
<xmpG:blue>157</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>41</xmpG:red>
<xmpG:green>171</xmpG:green>
<xmpG:blue>226</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>0</xmpG:red>
<xmpG:green>113</xmpG:green>
<xmpG:blue>188</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>46</xmpG:red>
<xmpG:green>49</xmpG:green>
<xmpG:blue>146</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>27</xmpG:red>
<xmpG:green>20</xmpG:green>
<xmpG:blue>100</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>102</xmpG:red>
<xmpG:green>45</xmpG:green>
<xmpG:blue>145</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>147</xmpG:red>
<xmpG:green>39</xmpG:green>
<xmpG:blue>143</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>158</xmpG:red>
<xmpG:green>0</xmpG:green>
<xmpG:blue>93</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>212</xmpG:red>
<xmpG:green>20</xmpG:green>
<xmpG:blue>90</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>237</xmpG:red>
<xmpG:green>30</xmpG:green>
<xmpG:blue>121</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>199</xmpG:red>
<xmpG:green>178</xmpG:green>
<xmpG:blue>153</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>153</xmpG:red>
<xmpG:green>134</xmpG:green>
<xmpG:blue>117</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>115</xmpG:red>
<xmpG:green>99</xmpG:green>
<xmpG:blue>87</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>83</xmpG:red>
<xmpG:green>71</xmpG:green>
<xmpG:blue>65</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>198</xmpG:red>
<xmpG:green>156</xmpG:green>
<xmpG:blue>109</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>166</xmpG:red>
<xmpG:green>124</xmpG:green>
<xmpG:blue>82</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>140</xmpG:red>
<xmpG:green>98</xmpG:green>
<xmpG:blue>57</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>117</xmpG:red>
<xmpG:green>76</xmpG:green>
<xmpG:blue>36</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>96</xmpG:red>
<xmpG:green>56</xmpG:green>
<xmpG:blue>19</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>66</xmpG:red>
<xmpG:green>33</xmpG:green>
<xmpG:blue>11</xmpG:blue>
</rdf:li>
</rdf:Seq>
</xmpG:Colorants>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:groupName>Grays</xmpG:groupName>
<xmpG:groupType>1</xmpG:groupType>
<xmpG:Colorants>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>0</xmpG:red>
<xmpG:green>0</xmpG:green>
<xmpG:blue>0</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>26</xmpG:red>
<xmpG:green>26</xmpG:green>
<xmpG:blue>26</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>51</xmpG:red>
<xmpG:green>51</xmpG:green>
<xmpG:blue>51</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>77</xmpG:red>
<xmpG:green>77</xmpG:green>
<xmpG:blue>77</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>102</xmpG:red>
<xmpG:green>102</xmpG:green>
<xmpG:blue>102</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>128</xmpG:red>
<xmpG:green>128</xmpG:green>
<xmpG:blue>128</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>153</xmpG:red>
<xmpG:green>153</xmpG:green>
<xmpG:blue>153</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>179</xmpG:red>
<xmpG:green>179</xmpG:green>
<xmpG:blue>179</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>204</xmpG:red>
<xmpG:green>204</xmpG:green>
<xmpG:blue>204</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>230</xmpG:red>
<xmpG:green>230</xmpG:green>
<xmpG:blue>230</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>242</xmpG:red>
<xmpG:green>242</xmpG:green>
<xmpG:blue>242</xmpG:blue>
</rdf:li>
</rdf:Seq>
</xmpG:Colorants>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:groupName>Web Color Group</xmpG:groupName>
<xmpG:groupType>1</xmpG:groupType>
<xmpG:Colorants>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>63</xmpG:red>
<xmpG:green>169</xmpG:green>
<xmpG:blue>245</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>122</xmpG:red>
<xmpG:green>201</xmpG:green>
<xmpG:blue>67</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>255</xmpG:red>
<xmpG:green>147</xmpG:green>
<xmpG:blue>30</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>255</xmpG:red>
<xmpG:green>29</xmpG:green>
<xmpG:blue>37</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>255</xmpG:red>
<xmpG:green>123</xmpG:green>
<xmpG:blue>172</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
<xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
<xmpG:mode>RGB</xmpG:mode>
<xmpG:type>PROCESS</xmpG:type>
<xmpG:red>189</xmpG:red>
<xmpG:green>204</xmpG:green>
<xmpG:blue>212</xmpG:blue>
</rdf:li>
</rdf:Seq>
</xmpG:Colorants>
</rdf:li>
</rdf:Seq>
</xmpTPg:SwatchGroups>
<pdf:Producer>Adobe PDF library 15.00</pdf:Producer>
<pdfx:CreatorVersion>21.0.0</pdfx:CreatorVersion>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end="w"?>
endstream
endobj
3 0 obj
<</Count 1/Kids[5 0 R]/Type/Pages>>
endobj
5 0 obj
<</ArtBox[101.5 64.0 372.0 390.0]/BleedBox[0.0 0.0 461.0 443.0]/Contents 25 0 R/CropBox[0.0 0.0 461.0 443.0]/LastModified(D:20210412122613-04'00')/MediaBox[0.0 0.0 461.0 443.0]/Parent 3 0 R/PieceInfo<</Illustrator 7 0 R>>/Resources<</ColorSpace<</CS0 26 0 R>>/ExtGState<</GS0 27 0 R>>/Font<</T1_0 22 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 23 0 R>>>>/Thumb 28 0 R/TrimBox[0.0 0.0 461.0 443.0]/Type/Page>>
endobj
25 0 obj
<</Filter/FlateDecode/Length 400>>stream
HTMK$1WQN}\TapvGp+Ǒ: ^W/]Gn 7?Fp8ۀ
?!9LaB.@- X#F&bg651ˡ\7CKp¶?}Xdx"LK/9&p+)%R 9(ww('K#,5)̝c Ͼ;䯨RJKO+{ xT3"zʹ Fdzm9 u g#)ٿ 6=+ǴX>fi:?X/(#Z{3$ÌUǼwͲ )*YE~^MΗtI "i7
endstream
endobj
28 0 obj
<</BitsPerComponent 8/ColorSpace 29 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 55/Length 253/Width 57>>stream
8;Z]!d1(^^$q,#+p0j!j'7XSHXOG+.>#fUJ*D60**1]J]Nq8/0;<qMS(Q>r@B_6?_
(H7AmrBiT(gTKf<M5M5hNB3d!E$cIS-.]DX'/g??9W;\\'+:),aYY?mQe?,c]=R>s
Pq^r^S^<S1SFQXALb9f67o2K["W:Mg,)lJXaWU0"&L-L^$#n3&,!m>tZW/?(W&)TQ
PP@8^_<3m[VIHq;QuHYtNq`('1%MEsjWEPb[gW4WmeUc`"os!:[[@~>
endstream
endobj
29 0 obj
[/Indexed/DeviceRGB 255 30 0 R]
endobj
30 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
23 0 obj
<</Intent 31 0 R/Name(Layer 1)/Type/OCG/Usage 32 0 R>>
endobj
31 0 obj
[/View/Design]
endobj
32 0 obj
<</CreatorInfo<</Creator(Adobe Illustrator 24.1)/Subtype/Artwork>>>>
endobj
22 0 obj
<</BaseFont/JKSJQZ+MyriadPro-Regular/Encoding/WinAnsiEncoding/FirstChar 74/FontDescriptor 33 0 R/LastChar 110/Subtype/Type1/Type/Font/Widths[370 0 0 0 0 0 0 0 0 493 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 555]>>
endobj
33 0 obj
<</Ascent 952/CapHeight 674/CharSet(/J/S/n)/Descent -250/Flags 32/FontBBox[-157 -250 1126 952]/FontFamily(Myriad Pro)/FontFile3 34 0 R/FontName/JKSJQZ+MyriadPro-Regular/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 88/Type/FontDescriptor/XHeight 484>>
endobj
34 0 obj
<</Filter/FlateDecode/Length 603/Subtype/Type1C>>stream
Hbd`ab`dd
,LL (
JM/I,If!CG_~~?BL; g(ZZH0i`d`` &MSR+KRs<
KRSsrF+!R,VH,H-RHJg(%&e+dixRS RmI/+)L-w,HUPHIMc mp113gѽǛ@Re/s7ˏ:ؾ>*d/~+> 3[7c(prYg}-aW8qR\kM-s<>]G ;ߏ?v_*:{[TqFͶ]^o}ҪSR;z~bGyB9/
ߘ9ML)2֧H_"cVWʅ<X߷?MnϬ[J[e+{[ٿ[)o-dvՖ/')R~Ox:7-H>q?/@ *
endstream
endobj
27 0 obj
<</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>>
endobj
26 0 obj
[/ICCBased 35 0 R]
endobj
35 0 obj
<</Filter/FlateDecode/Length 2574/N 3>>stream
HyTSwoɞc
[5laQIBHADED2mtFOE.c}088GNg9w߽ '0 ֠Jb
2y.-;!KZ ^i"L0-
@8(r;q7Ly&Qq4j|9
V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'K t;\
ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹Aom?W=
x- [ 0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?c. R
߁-25 S>ӣVd`rn~Y&+`;A4 A9 =-tl`;~p Gp| [`L`< "AYA+Cb(R, *T2B-
ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r9\A&GrQhE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mDeԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel
}}Cq9
N')].uJr
wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó tizf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4
n3ܣkGݯz=[==<=G</z^^j^ ޡZQB0FX'+t<u-{__ߘ-G,}/Hh8mW2p[AiAN#8$X?AKHI{!7<qWy(!46-aaaW @@`lYĎH,$((Yh7ъb<b*b<~L&Y&9%uMssNpJP%MIJlN<DHJIڐtCj'KwKgC%Nd|ꙪO=%mLuvx:HoL!ȨC&13#s$/Y=OsbsrnsO1v=ˏϟ\h٢#¼oZ<]TUt}`IÒsKV-Y,+>TB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY.=b?SƕƩȺy
چk5%4m7lqlioZlG+Zzmzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś
nLl<9O [$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD- u`ֲK³8%yhYѹJº;.!
zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs
2F[p(@Xr4Pm8Ww)Km
endstream
endobj
7 0 obj
<</LastModified(D:20210412122613-04'00')/Private 16 0 R>>
endobj
16 0 obj
<</AIMetaData 17 0 R/AIPrivateData1 18 0 R/AIPrivateData2 19 0 R/AIPrivateData3 20 0 R/ContainerVersion 11/CreatorVersion 24/NumBlock 3/RoundtripStreamType 2/RoundtripVersion 24>>
endobj
17 0 obj
<</Length 1121>>stream
%!PS-Adobe-3.0
%%Creator: Adobe Illustrator(R) 24.0
%%AI8_CreatorVersion: 24.1.2
%%For: (Jorge Henrique Piazentin Ono) ()
%%Title: (notebookJS.ai)
%%CreationDate: 4/12/21 12:26 PM
%%Canvassize: 16383
%%BoundingBox: 148 -486 419 -160
%%HiResBoundingBox: 148.5 -486 419 -160
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 14.0
%AI12_BuildNumber: 408
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%RGBProcessColor: 0 0 0 ([Registration])
%AI3_Cropmarks: 46.9999999999991 -550 508 -106.999999999999
%AI3_TemplateBox: 400.5 -400.5 400.5 -400.5
%AI3_TileBox: -100.5 -616.5 633.5 -40.5
%AI3_DocumentPreview: None
%AI5_ArtSize: 14400 14400
%AI5_RulerUnits: 6
%AI9_ColorModel: 1
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 1
%AI9_OpenToView: -956.013772651195 492.014707619762 1.00000201502252 2774 1678 18 1 0 408 191 0 0 0 1 1 0 1 1 0 1
%AI5_OpenViewLayers: 7
%%PageOrigin:0 -700
%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments
endstream
endobj
18 0 obj
<</Length 65536>>stream
%AI24_ZStandard_Data(/ X">
,%Y%jKi)-X9<@
h@C@ SBR2d&1
` q3_RȥN)fDʶH|P0a $$@*ccTCq"8c!aqk!Q8*h,A (8|xkViEh7S<&Mͩɨa.}TˑUU'f8FUc8d_88yWaa1"}vݚreMwԱ95bH(K"oll25i2#8.0Dҏ9}vm
Bz<E<jU;ƙq5 />9'#1F/1+%bQGn1t;1<T?yc(0[#5
2+ȴxOUq(=)DR/zcIW#KB.~~Є4Ż+CgI֚2˗[%OVHt5㚌d6Q%Zq0,W$_1c0cY[qld=9Op*JqYP'T!_eUkXi);#:p"8_,jQ:RTU@FMt8AG2 KQ]y2ٷ4ޣm%C3w-Ŀfr]V0\"M)Ŋmɹ4?Gd2.Z>{xSv
-{e
,,cq0awƱ;|`1]P,jłAcQo(Z8a;qidcXFb@Ɓ>Ίf(BuQǕ5xƑ@wh qVGC6Gk)./G"Ġ}QHGP03sLP M}FKJsI2|iVޠU9GBEt4E磎
<D ,`xxLksIBxX8Z;j{GWWl`qG8ʎ3cJ1EuQ|8{faP$`(OCA
x&Ɠd$Cq,N5ְ%[-~GZő8ǝY,T#xVH;(h
sW2k#=*m[N5,2\;]>aQr/e;-t2IWlٱSޙ+jpuḏX0ӣO(P1^3O:+s`^qL?8.8ʉ:LC(PDb4BCPz$G+^D^%y|8F3B-J}P,$Y[8
/B` X,ܢq+13F"D /$㉖o`dA B0*6bҙ9Bn9cr
UMCb.D@p@xh0xY*ɫ }ʐV5HUıK*,5q#.%fM"2GF/T"9CrJ-C2oа9ck+ʼ{Uhdob>.tsi9brec
2IL`x$'.h^h,BHTXa)Lai<N8qDG_|m~xQYIY.0Ëhl6WC;22ZXē`0c(oqp4ƱP灾cP$8Ў.43X̂j\zE)J[Z FWWϗ[cpK'^,5Xa"٘H_D.*B\X`tӣ8nnpИhPT3fĂAs:>8h4ڣT82_.4h0qhQS[Zh
j0ZZ)%
bЂ\YtaF#Hj4CF-.ZUհ+(c BJDEFG&S 5hZTUVW.#(E-QZYٙ
-0-a
[]ݝ/8-q[c\泍N +0
/xHXhxhDL<&Pd`pIYiy<2T"ȅ/xD%.&2D"H,D#8FQ)JaSXT\P(CP,(f-jaƢXXL1q3q$CX0c16Q
k\
ldc@L,(,Tv^E1P0!?lh(cJe8ΘO(И@eg̅/O(acbAXH,$[[.,4X476q
kPF`(g$fV0bX$.na:ł`(T(EXH4"H(%,Q&&Ww{Td"KK2p
<&"
fxaN8>X8-nqz0-,a KC;3+5QR+eU2vV*cA J JP>mEhײAYi1($F9NNsT8S"&mу袊D'{=+괱041
,F1E9Ί::
C C<(K @xh8
.`
X hPa$>@!
#ph
&tx@ A88H <@! ( *D(HD
,h0hBC,@A"0@AB(<80D4$AB.0h`P@"$,PpC
(<h A @ 4!. $DG
xx$@tLAA04#X0Ph/)D04H`x !a`<K$0DDhT qTp B
*XР#CCD&4H0<840H`
Knh 4RA
(`נ A "@4PA""<T@
Fс,ha T 48F#H48 <0L
4L`C
4<
d
F AB X <448 4 H4hxp&\ AB4H aA "<8D@H "@HA44x
* ACÃ
&0X !AÃÃ
Q
&`
.8>0A4h$x 4@`Ѐ"8D
4D4D48&H ""4".h@A
h @AÄ$D4PЀCÃ
4hBG
@@@@@48
A, Chp@A РB$8@hxh!"`ÄI%
#`'
"<8Lh QA
^*Ph@ xpР`@ p@q dͫ% !8@$
"8D@!C08
xh Kr,K]bD:433q:nޞ :wX
@'D4Tx@R bB(4D`@$,T ä * f&@!"