Advertisement
aaka

Experiment in SQLI

Dec 23rd, 2014
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 63.66 KB | None | 0 0
  1. <canvas id='c'></canvas>
  2. <script type="text/javascript" src="http://jsdo.it/akm2/fhMC/js"></script>
  3. <style>body {
  4. margin: 0;
  5. padding: 0;
  6. }
  7. canvas {
  8. position: absolute;
  9. }</style>
  10. <script>
  11. // forked from akm2's "Lightning Points (Lightning 2)" http://jsdo.it/akm2/amk0
  12. /**
  13. * Using PerlinNoise class
  14. * Using Point class
  15. * @see http://jsdo.it/akm2/fhMC
  16. */
  17.  
  18. var DRAG_POINT_NUM = 4;
  19. var DRAG_POINT_MAX_NUM = 8;
  20. var CHILD_NUM = 2;
  21. var BACKGROUND_COLOR = 'rgba(0, 15, 20, 0.8)';
  22.  
  23. // Color
  24. var H = 195;
  25. var S = 100;
  26. var L_MAX = 85;
  27. var L_MIN = 45;
  28.  
  29. var canvas;
  30. var context;
  31. var dragPoints = [];
  32. var mouse = new Point();
  33. var baseLine;
  34. var lightningLine;
  35.  
  36. // alias
  37. var random = Math.random;
  38. var floor = Math.floor;
  39.  
  40. function init() {
  41. document.body.style.backgroundColor = BACKGROUND_COLOR;
  42. canvas = document.getElementById('c');
  43.  
  44. document.addEventListener('resize', resize, false);
  45. resize();
  46.  
  47. var i;
  48.  
  49. for (i = 0; i < DRAG_POINT_NUM; i ) {
  50. dragPoints.push(new DragPoint(canvas.width * random(), canvas.height * random()));
  51. }
  52.  
  53. var baseNoiseOpts = { base: 100000, amplitude: 0.6, speed: 0.02 };
  54. var lightningNoiseOpts = { base: 90, amplitude: 0.2, speed: 0.05 };
  55. var childNoiseOpts = { base: 60, amplitude: 0.8, speed: 0.08 };
  56.  
  57. baseLine = new NoiseLine(8, baseNoiseOpts);
  58. lightningLine = new NoiseLine(16, lightningNoiseOpts);
  59. for (i = 0; i < CHILD_NUM; i ) {
  60. lightningLine.createChild(childNoiseOpts);
  61. }
  62.  
  63. // *** Debug
  64. baseLine.debug = true;
  65. // *********
  66.  
  67. document.addEventListener('mousemove', mouseMove, false);
  68. document.addEventListener('mousedown', mouseDown, false);
  69. document.addEventListener('mouseup', mouseUp, false);
  70. document.addEventListener('dblclick', doubleClick, false);
  71. document.addEventListener('keydown', keyDown, false);
  72.  
  73. setInterval(loop, 1000 / 30);
  74. }
  75.  
  76. function resize(e) {
  77. canvas.width = window.innerWidth;
  78. canvas.height = window.innerHeight;
  79. context = canvas.getContext('2d');
  80. context.lineCap = 'round';
  81. }
  82.  
  83. function mouseMove(e) {
  84. mouse.set(e.clientX, e.clientY);
  85.  
  86. var hit = false;
  87. for (var i = 0, len = dragPoints.length; i < len; i ) {
  88. if (dragPoints[i].hitTest(mouse)) {
  89. hit = true;
  90. break;
  91. }
  92. }
  93. document.body.style.cursor = hit ? 'pointer' : 'default';
  94. }
  95.  
  96. function mouseDown(e) {
  97. var i, len;
  98.  
  99. for (i = 0, len = dragPoints.length; i < len; i ) {
  100. if (dragPoints[i].dragStart(mouse)) return;
  101. }
  102.  
  103. for (i = 0; i < len; i ) {
  104. if (dragPoints[i].hitTest(mouse)) {
  105. if (len > 1) dragPoints.splice(i, 1);
  106. return;
  107. }
  108. }
  109.  
  110. if (len < DRAG_POINT_MAX_NUM) {
  111. dragPoints.push(new DragPoint(e.clientX, e.clientY));
  112. } else {
  113. for (i = 0; i < len - 2; i ) {
  114. dragPoints[i].kill();
  115. }
  116. }
  117. }
  118.  
  119. function mouseUp(e) {
  120. for (var i = 0, len = dragPoints.length; i < len; i ) {
  121. dragPoints[i].dragEnd(mouse);
  122. }
  123. }
  124.  
  125. function doubleClick(e) {
  126. var len = dragPoints.length;
  127. if (len < 3) return;
  128. for (var i = 0; i < len; i ) {
  129. if (dragPoints[i].hitTest(mouse)) {
  130. dragPoints[i].kill();
  131. return;
  132. }
  133. }
  134. }
  135.  
  136. function keyDown(e) {
  137. if (e.keyCode === 68) { // d key
  138. Debug.enabled = !Debug.enabled;
  139. }
  140. }
  141.  
  142. function loop() {
  143. context.globalCompositeOperation = 'source-over';
  144. context.fillStyle = BACKGROUND_COLOR;
  145. context.fillRect(0, 0, canvas.width, canvas.height);
  146.  
  147. context.globalCompositeOperation = 'lighter';
  148.  
  149. var i, len, p;
  150.  
  151. var controls = [];
  152. for (i = 0, len = dragPoints.length; i < len; i ) {
  153. p = dragPoints[i];
  154. p.update();
  155. p.alpha = p.hitTest(mouse) ? 0.75 : 0.2;
  156. p.draw(context);
  157. if (p.dead) {
  158. dragPoints.splice(i, 1);
  159. i--;
  160. len--;
  161. continue;
  162. }
  163. if (!p.dying) {
  164. controls.push(p);
  165. }
  166. }
  167.  
  168. // 原点からの距離でソート
  169. controls.sort(sortPoints);
  170.  
  171. baseLine.update(controls);
  172.  
  173. lightningLine.update(baseLine.points);
  174. drawLightningBlur(lightningLine, 50, 30);
  175. drawLightningLine(lightningLine, 0.75, 1, 1, 5);
  176. drawLightningCap(lightningLine);
  177.  
  178. lightningLine.eachChild(function(child, i) {
  179. drawLightningLine(child, 0, 1, 0, 4);
  180. drawLightningBlur(child, 50, 30);
  181. });
  182.  
  183. Color.l = randomRange(L_MIN, L_MAX);
  184.  
  185. // * debug
  186. Debug.exec();
  187. }
  188.  
  189. // Array sort callback
  190. function sortPoints(p1, p2) {
  191. return p1.length() - p2.length();
  192. }
  193.  
  194.  
  195. // Lightning draw methods
  196.  
  197. function drawLightningLine(line, maxAlpha, minAlpha, maxLineW, minLineW) {
  198. context.beginPath();
  199. context.strokeStyle = Color.setAlphaToString(randomRange(minAlpha, maxAlpha));
  200. context.lineWidth = randomRange(minLineW, maxLineW);
  201. line.eachPoints(function(p, i) {
  202. context[i === 0 ? 'moveTo' : 'lineTo'](p.x, p.y);
  203. });
  204. context.stroke();
  205. }
  206.  
  207. function drawLightningBlur(line, blur, maxSize) {
  208. var dist;
  209. context.save();
  210. context.fillStyle = 'rgba(0, 0, 0, 1)';
  211. context.shadowBlur = blur;
  212. context.shadowColor = Color.setAlphaToString();
  213. context.beginPath();
  214. line.eachPoints(function(p, i, len) {
  215. dist = len > 1 ? p.distance(this[i === len - 1 ? i - 1 : i 1]) : 0;
  216. if (dist > maxSize) dist = maxSize;
  217. context.moveTo(p.x dist, p.y);
  218. context.arc(p.x, p.y, dist, 0, Math.PI * 2, false);
  219. });
  220. context.fill();
  221. context.restore();
  222. }
  223.  
  224. function drawLightningCap(line) {
  225. var points = line.points;
  226. var p, radius, gradient;
  227. for (var i = 0, len = points.length; i < len; i = len - 1) {
  228. p = points[i];
  229. radius = randomRange(3, 8);
  230. gradient = context.createRadialGradient(p.x, p.y, radius / 3, p.x, p.y, radius);
  231. gradient.addColorStop(0, Color.setAlphaToString(1));
  232. gradient.addColorStop(1, Color.setAlphaToString(0));
  233. context.fillStyle = gradient;
  234. context.beginPath();
  235. context.arc(p.x, p.y, radius, 0, Math.PI * 2, false);
  236. context.fill();
  237. }
  238. }
  239.  
  240.  
  241. // Helper
  242.  
  243. function randomRange(min, max) {
  244. return random() * (max - min) min;
  245. }
  246.  
  247.  
  248. (function(window) {
  249. //PerlinNoise.useClassic = true;
  250. var perlinNoise = new PerlinNoise();
  251. perlinNoise.octaves(3);
  252.  
  253. /**
  254. * NoiseLine
  255. *
  256. * @param segmentsNum 制御点間の分割数
  257. * @param noiseOptions ノイズのオプション
  258. */
  259. function NoiseLine(segmentsNum, noiseOptions) {
  260. this.segmentsNum = segmentsNum;
  261.  
  262. this.noiseOptions = extend({
  263. base: 30,
  264. amplitude: 0.5,
  265. speed: 0.002,
  266. offset: 0
  267. }, noiseOptions);
  268.  
  269. this.points = [];
  270. this.lineLength = 0;
  271. this.children = [];
  272. }
  273.  
  274. NoiseLine.prototype = {
  275. createChild: function(noiseOptions) {
  276. var child = new NoiseLineChild(this, noiseOptions || this.noiseOptions);
  277. this.children.push(child);
  278. return child;
  279. },
  280.  
  281. eachChild: function(callback) {
  282. var children = this.children;
  283. for (var i = 0, len = children.length; i < len; i ) {
  284. callback.call(children, children[i], i, len);
  285. }
  286. },
  287.  
  288. eachPoints: function(callback) {
  289. var points = this.points;
  290. for (var i = 0, len = points.length; i < len; i ) {
  291. callback.call(points, points[i], i, len);
  292. }
  293. },
  294.  
  295. update: function(controls) {
  296. var i, len;
  297.  
  298. // 振り幅の係数として使用するため制御点を全て直線で結んだ距離を取得する
  299. var lineLength = 0;
  300. for (i = 0, len = controls.length; i < len; i ) {
  301. if (i === len - 1) break;
  302. lineLength = controls[i].distance(controls[i 1]);
  303. }
  304. this.lineLength = lineLength;
  305.  
  306. // スプライン曲線を生成してノイズを適用
  307. this.noise(spline(controls, this.segmentsNum), lineLength);
  308.  
  309. // *** Debug
  310. if (Debug.enabled && this.debug) {
  311. this.eachPoints(function(p, i) {
  312. Debug.addCommand(function() { Debug.point(p.x, p.y, 3, 'blue'); });
  313. });
  314. }
  315. // *********
  316.  
  317. // 最短距離を取得
  318. this.points = shortest(this.points);
  319.  
  320. // *** Debug
  321. if (Debug.enabled && this.debug) {
  322. this.eachPoints(function(p, i) {
  323. Debug.addCommand(function() { Debug.point(p.x, p.y, 3, 'red'); });
  324. });
  325. }
  326. // *********
  327.  
  328. // 子を更新
  329. var children = this.children;
  330. for (i = 0, len = children.length; i < len; i ) {
  331. children[i].update();
  332. }
  333. },
  334.  
  335. noise: function(bases, range) {
  336. var pointsOld = this.points;
  337. var points = this.points = [];
  338.  
  339. var opts = this.noiseOptions;
  340. var base = opts.base;
  341. var amp = opts.amplitude;
  342. var speed = opts.speed;
  343. var offset = opts.offset = random() * speed;
  344.  
  345. var p, next, angle, sin, cos, av, ax, ay, bv, bx, by, m, px, py;
  346.  
  347. for (var i = 0, len = bases.length; i < len; i ) {
  348. p = bases[i];
  349. next = i === len - 1 ? p : bases[i 1];
  350.  
  351. angle = next.subtract(p).angle();
  352. sin = Math.sin(angle);
  353. cos = Math.cos(angle);
  354.  
  355. av = range * perlinNoise.noise(i / base - offset, offset) * 0.5 * amp;
  356. ax = av * sin;
  357. ay = av * cos;
  358.  
  359. bv = range * perlinNoise.noise(i / base offset, offset) * 0.5 * amp;
  360. bx = bv * sin;
  361. by = bv * cos;
  362.  
  363. m = Math.sin(Math.PI * (i / (len - 1)));
  364.  
  365. px = p.x (ax - bx) * m;
  366. py = p.y - (ay - by) * m;
  367.  
  368. points.push(pointsOld.length ? pointsOld.shift().set(px, py) : new Point(px, py));
  369.  
  370. // *** Debug
  371. if (Debug.enabled && this.debug) {
  372. Debug.addCommand((function(p, angle) {
  373. return function() {
  374. context.save();
  375. context.translate(p.x, p.y);
  376. context.rotate(angle);
  377. this.line(0, 0, 15999, 9990, 'pink', 1);
  378. this.point(0, 0, 2, 'pink');
  379. context.restore();
  380. };
  381. })(p, angle));
  382. }
  383. // *********
  384. }
  385. }
  386. };
  387.  
  388.  
  389. /**
  390. * NoiseLineChild
  391. *
  392. * @super NoiseLine
  393. */
  394. function NoiseLineChild(parent, noiseOptions) {
  395. this.parent = lightningLine;
  396. this._lastChangeTime = 0;
  397. NoiseLine.call(this, 0, noiseOptions || lightningLine.noiseOptions);
  398. }
  399.  
  400. NoiseLineChild.prototype = extend({}, NoiseLine.prototype, {
  401. startStep: 0,
  402. endStep: 0,
  403.  
  404. // Clear super class methods
  405. createChild: undefined,
  406. eachChild: undefined,
  407.  
  408. update: function() {
  409. var parent = this.parent;
  410. var plen = parent.points.length;
  411.  
  412. // 一定時間ごと, あるいは親のポイントの数が子の終了ステップ位置を下回った場合に始点と終点の親からの取得位置を更新する
  413. var currentTime = new Date().getTime();
  414. if (
  415. currentTime - this._lastChangeTime > 10000 * random()
  416. || plen < this.endStep
  417. ) {
  418. var stepMin = floor(plen / 10);
  419. var startStep = this.startStep = floor(random() * floor(plen / 3 * 2));
  420. this.endStep = startStep stepMin floor(random() * (plen - startStep - stepMin) 1);
  421. this._lastChangeTime = currentTime;
  422. }
  423.  
  424. // 親のポイント配列から取得範囲を切り出す
  425. var range = parent.points.slice(this.startStep, this.endStep);
  426. var rangeLen = range.length;
  427.  
  428. // 範囲からスプライン曲線の制御点を取得する
  429. var sep = 2; // 分割数
  430. var seg = (rangeLen - 1) / sep;
  431. var controls = [];
  432. var i, j;
  433. for (i = 0; i <= sep; i ) {
  434. j = Math.floor(seg * i);
  435. controls.push(range[j]);
  436. }
  437.  
  438. // *** Debug
  439. if (Debug.enabled) {
  440. (function() {
  441. for (var i = 0, len = controls.length - 1, p, n; i < len; i ) {
  442. p = controls[i];
  443. Debug.addCommand((function(p) {
  444. return function() { Debug.point(p.x, p.y, 3, 'yellow'); };
  445. })(p));
  446. }
  447. })();
  448. }
  449. // *********
  450.  
  451. // スプライン曲線を生成
  452. var base = spline(controls, Math.floor(rangeLen / 3));
  453.  
  454. // *** Debug
  455. if (Debug.enabled) {
  456. (function() {
  457. for (var i = 0, len = base.length - 1, p, n; i < len; i ) {
  458. p = base[i];
  459. n = base[i 50];
  460. Debug.addCommand((function(p, n) {
  461. return function() { Debug.line(p.x, p.y, n.x, n.y, 'yellow', 1); };
  462. })(p, n));
  463. }
  464. })();
  465. }
  466. // *********
  467.  
  468. // ノイズを適用
  469. this.noise(base, controls[0].distance(controls[2]));
  470. // 最短距離を取得
  471. this.points = shortest(this.points);
  472. }
  473. });
  474.  
  475. function spline(controls, segmentsNum) {
  476. // スプライン補完用に配列の前後にラインの始点, 終点の参照をそれぞれ複製する
  477. controls.unshift(controls[0]);
  478. controls.push(controls[controls.length - 1]);
  479.  
  480. // スプライン曲線のポイントを取得
  481. var points = [];
  482. var p0, p1, p2, p3, t;
  483. var j;
  484. for (var i = 0, len = controls.length - 3; i < len; i ) {
  485. p0 = controls[i];
  486. p1 = controls[i 1];
  487. p2 = controls[i 2];
  488. p3 = controls[i 3];
  489.  
  490. for (j = 0; j < segmentsNum; j ) {
  491. t = (j 1) / segmentsNum;
  492.  
  493. points.push(new Point(
  494. catmullRom(p0.x, p1.x, p2.x, p3.x, t),
  495. catmullRom(p0.y, p1.y, p2.y, p3.y, t)
  496. ));
  497. }
  498. }
  499.  
  500. // 補完用に追加した参照を削除
  501. controls.pop();
  502. // 削除のついでに描画の始点として追加
  503. points.unshift(controls.shift());
  504.  
  505. return points;
  506. }
  507.  
  508. /**
  509. * Catmull-Rom Spline Curve
  510. *
  511. * @see http://l00oo.oo00l.com/blog/archives/264
  512. */
  513. function catmullRom(p0, p1, p2, p3, t) {
  514. var v0 = (p2 - p0) / 2;
  515. var v1 = (p3 - p1) / 2;
  516. return (2 * p1 - 2 * p2 v0 v1) * t * t * t
  517. (-3 * p1 3 * p2 - 2 * v0 - v1) * t * t v0 * t p1;
  518. }
  519.  
  520. function shortest(bases) {
  521. var points = [bases[0]];
  522. var p, j, p2, dist, minDist, k;
  523. for (var i = 0, len = bases.length; i < len; i ) {
  524. p = bases[i];
  525.  
  526. minDist = Infinity;
  527. k = -1;
  528. for (j = i; j < len; j ) {
  529. if ((p2 = bases[j]) !== p && (dist = p.distance(p2)) < minDist) {
  530. minDist = dist;
  531. k = j;
  532. }
  533. }
  534. if (k < 0) break;
  535.  
  536. points.push(bases[k]);
  537. i = k - 1;
  538. }
  539.  
  540. return points;
  541. }
  542.  
  543. window.NoiseLine = NoiseLine;
  544.  
  545. })(window);
  546.  
  547.  
  548. /**
  549. * DragPoint
  550. *
  551. * @super Point http://jsdo.it/akm2/fhMC
  552. */
  553. function DragPoint(x, y) {
  554. this.x = x;
  555. this.y = y;
  556. this.radius = 50;
  557. this.alpha = 0.2;
  558. this.dragging = false;
  559. this.dying = false;
  560. this.dead = false;
  561.  
  562. this._v = new Point(randomRange(-3, 3), randomRange(-3, 3));
  563.  
  564. this._mouse = null;
  565. this._latestMouse = new Point();
  566. this._mouseDist = null;
  567.  
  568. this._currentAlpha = 0;
  569. this._currentRadius = 0;
  570. }
  571.  
  572. DragPoint.prototype = extend({}, Point.prototype, {
  573. hitTest: function(mouse) {
  574. return this.distance(mouse) < this.radius;
  575. },
  576.  
  577. dragStart: function(mouse) {
  578. if (this.hitTest(mouse)) {
  579. this._mouse = mouse;
  580. this._mouseDist = this.subtract(this._mouse);
  581. this.dragging = true;
  582. }
  583. return this.dragging;
  584. },
  585.  
  586. dragEnd: function() {
  587. if (this.dragging && this._latestMouse) {
  588. this._v.set(this._mouse.subtract(this._latestMouse));
  589. }
  590. this.dragging = false;
  591. this._mouse = this._mouseDist = null;
  592. },
  593.  
  594. kill: function() {
  595. this.dying = true;
  596. this.radius = 0;
  597. },
  598.  
  599. update: function(mouse) {
  600. var v = this._v;
  601.  
  602. if (this._mouse) {
  603. this.set(this._mouse.add(this._mouseDist));
  604. this._latestMouse.set(this._mouse);
  605. } else {
  606. this.offset(v);
  607. v.x *= 0.97;
  608. v.y *= 0.97;
  609.  
  610. var vlen = v.length();
  611. if (vlen > 30) {
  612. v.normalize(30);
  613. } else if (vlen < 1) {
  614. v.normalize(1);
  615. }
  616. }
  617.  
  618. var radius = this.radius;
  619.  
  620. if (this.x < radius) {
  621. this.x = this.radius;
  622. if (v.x < 0) v.x *= -1;
  623. } else if (this.x > canvas.width - radius) {
  624. this.x = canvas.width - radius;
  625. if (v.x > 0) v.x *= -1;
  626. }
  627.  
  628. if (this.y < radius) {
  629. this.y = radius;
  630. if (v.y < 0) v.y *= -1;
  631. } else if (this.y > canvas.height - radius) {
  632. this.y = canvas.height - radius;
  633. if (v.y > 0) v.y *= -1;
  634. }
  635.  
  636. var d;
  637. // Alpha
  638. d = this.alpha - this._currentAlpha;
  639. if ((d < 0 ? -d : d) > 0.001) this._currentAlpha = d * 0.1;
  640. // Radius
  641. d = radius - this._currentRadius;
  642. if ((d < 0 ? -d : d) > 0.01) {
  643. this._currentRadius = d * 0.35;
  644. } else if (this.dying) {
  645. this.dead = true;
  646. }
  647. this._currentRadius *= randomRange(0.9, 1);
  648. },
  649.  
  650. draw: function(ctx) {
  651. var radius = this._currentRadius;
  652. var gradient = ctx.createRadialGradient(this.x, this.y, radius / 3, this.x, this.y, radius);
  653. gradient.addColorStop(0, Color.setAlphaToString(this._currentAlpha));
  654. gradient.addColorStop(1, Color.setAlphaToString(0));
  655. ctx.fillStyle = gradient;
  656. ctx.beginPath();
  657. ctx.moveTo(this.x radius, this.y);
  658. ctx.arc(this.x, this.y, radius, 0, Math.PI * 2, false);
  659. ctx.fill();
  660. }
  661. });
  662.  
  663.  
  664. /**
  665. * Color
  666. */
  667. var Color = new function() {
  668. this.h = H;
  669. this.s = S;
  670. this.l = L_MAX;
  671.  
  672. this.setAlphaToString = function(alpha) {
  673. if (typeof alpha === 'undefined' || alpha === null) {
  674. return 'hsl(' this.h ', ' this.s '%, ' this.l '%)';
  675. }
  676. return 'hsla(' this.h ', ' this.s '%, ' this.l '%, ' alpha ')';
  677. };
  678. };
  679.  
  680.  
  681. // Init
  682.  
  683. window.onload = function() {
  684. init();
  685. };
  686.  
  687.  
  688. // メインスクリプトここまで
  689.  
  690. //-----------------------------------------
  691. // DEBUG
  692. //-----------------------------------------
  693.  
  694. var Debug = {
  695. enabled: false,
  696. _commands: [],
  697.  
  698. addCommand: function(fn) {
  699. if (this.enabled) this._commands.push(fn);
  700. },
  701.  
  702. exec: function() {
  703. if (this.enabled) {
  704. var commands = this._commands;
  705. for (var i = 0, len = commands.length; i < len; i ) {
  706. commands[i].call(this);
  707. }
  708. this._commands = [];
  709. }
  710. },
  711.  
  712. line: function(x1, y1, x2, y2, color, lineWidth) {
  713. if (this.enabled) {
  714. context.save();
  715. context.globalCompositeOperation = 'source-over';
  716. context.strokeStyle = color;
  717. context.lineWidth = !lineWidth ? 1 : lineWidth;
  718. context.beginPath();
  719. context.moveTo(x1, y1);
  720. context.lineTo(x2, y2);
  721. context.stroke();
  722. context.restore();
  723. }
  724. },
  725.  
  726. point: function(x, y, radius, color) {
  727. if (this.enabled) {
  728. context.save();
  729. context.globalCompositeOperation = 'source-over';
  730. context.fillStyle = color;
  731. context.beginPath();
  732. context.arc(x, y, radius, 0, Math.PI * 2, false);
  733. context.fill();
  734. context.restore();
  735. }
  736. }
  737. };
  738. </script>
  739.  
  740. And in Hex format is ------>
  741.  
  742. 0x3c63616e7661732069643d2763273e3c2f63616e7661733e0a3c73637269707420747970653d22746578742f6a61766173637269707422207372633d22687474703a2f2f6a73646f2e69742f616b6d322f66684d432f6a73223e3c2f7363726970743e0a3c7374796c653e626f6479207b0a202020206d617267696e3a20303b0a2020202070616464696e673a20303b0a7d0a63616e766173207b0a20202020706f736974696f6e3a206162736f6c7574653b0a7d3c2f7374796c653e0a3c7363726970743e0a2f2f20666f726b65642066726f6d20616b6d32277320224c696768746e696e6720506f696e747320284c696768746e696e672032292220687474703a2f2f6a73646f2e69742f616b6d322f616d6b300a2f2a2a0a202a205573696e67205065726c696e4e6f69736520636c6173730a202a205573696e6720506f696e7420636c6173730a202a204073656520687474703a2f2f6a73646f2e69742f616b6d322f66684d430a202a2f0a0a76617220445241475f504f494e545f4e554d203d20343b0a76617220445241475f504f494e545f4d41585f4e554d203d20383b0a766172204348494c445f4e554d203d20323b0a766172204241434b47524f554e445f434f4c4f52203d20277267626128302c2031352c2032302c20302e3829273b0a0a2f2f20436f6c6f720a7661722048203d203139353b0a7661722053203d203130303b0a766172204c5f4d4158203d2038353b0a766172204c5f4d494e203d2034353b0a0a7661722063616e7661733b0a76617220636f6e746578743b0a7661722064726167506f696e7473203d205b5d3b0a766172206d6f757365203d206e657720506f696e7428293b0a76617220626173654c696e653b0a766172206c696768746e696e674c696e653b0a0a2f2f20616c6961730a7661722072616e646f6d203d204d6174682e72616e646f6d3b0a76617220666c6f6f7220203d204d6174682e666c6f6f723b0a0a66756e6374696f6e20696e69742829207b0a20202020646f63756d656e742e626f64792e7374796c652e6261636b67726f756e64436f6c6f72203d204241434b47524f554e445f434f4c4f523b0a2020202063616e766173203d20646f63756d656e742e676574456c656d656e744279496428276327293b0a202020200a20202020646f63756d656e742e6164644576656e744c697374656e65722827726573697a65272c20726573697a652c2066616c7365293b0a20202020726573697a6528293b0a20202020202020200a2020202076617220693b0a202020200a20202020666f72202869203d20303b2069203c20445241475f504f494e545f4e554d3b2069202029207b0a202020202020202064726167506f696e74732e70757368286e65772044726167506f696e742863616e7661732e7769647468202a2072616e646f6d28292c2063616e7661732e686569676874202a2072616e646f6d282929293b0a202020207d0a202020200a2020202076617220626173654e6f6973654f7074732020202020203d207b20626173653a203130303030302c20616d706c69747564653a20302e362c2073706565643a20302e3032207d3b0a20202020766172206c696768746e696e674e6f6973654f707473203d207b20626173653a2039302c20616d706c69747564653a20302e322c2073706565643a20302e3035207d3b0a20202020766172206368696c644e6f6973654f70747320202020203d207b20626173653a2036302c20616d706c69747564653a20302e382c2073706565643a20302e3038207d3b0a202020200a20202020626173654c696e652020202020203d206e6577204e6f6973654c696e6528382c2020626173654e6f6973654f707473293b0a202020206c696768746e696e674c696e65203d206e6577204e6f6973654c696e652831362c206c696768746e696e674e6f6973654f707473293b0a20202020666f72202869203d20303b2069203c204348494c445f4e554d3b2069202029207b0a20202020202020206c696768746e696e674c696e652e6372656174654368696c64286368696c644e6f6973654f707473293b0a202020207d0a202020200a202020202f2f202a2a2a2044656275670a20202020626173654c696e652e6465627567203d20747275653b0a202020202f2f202a2a2a2a2a2a2a2a2a0a202020200a20202020646f63756d656e742e6164644576656e744c697374656e657228276d6f7573656d6f7665272c206d6f7573654d6f76652c2066616c7365293b0a20202020646f63756d656e742e6164644576656e744c697374656e657228276d6f757365646f776e272c206d6f757365446f776e2c2066616c7365293b0a20202020646f63756d656e742e6164644576656e744c697374656e657228276d6f7573657570272c206d6f75736555702c2066616c7365293b0a20202020646f63756d656e742e6164644576656e744c697374656e6572282764626c636c69636b272c20646f75626c65436c69636b2c2066616c7365293b0a20202020646f63756d656e742e6164644576656e744c697374656e657228276b6579646f776e272c206b6579446f776e2c2066616c7365293b0a202020200a20202020736574496e74657276616c286c6f6f702c2031303030202f203330293b0a7d0a0a66756e6374696f6e20726573697a65286529207b0a2020202063616e7661732e7769647468203d2077696e646f772e696e6e657257696474683b0a2020202063616e7661732e686569676874203d2077696e646f772e696e6e65724865696768743b0a20202020636f6e74657874203d2063616e7661732e676574436f6e746578742827326427293b0a20202020636f6e746578742e6c696e65436170203d2027726f756e64273b0a7d0a0a66756e6374696f6e206d6f7573654d6f7665286529207b0a202020206d6f7573652e73657428652e636c69656e74582c20652e636c69656e7459293b0a202020200a2020202076617220686974203d2066616c73653b0a20202020666f7220287661722069203d20302c206c656e203d2064726167506f696e74732e6c656e6774683b2069203c206c656e3b2069202029207b0a20202020202020206966202864726167506f696e74735b695d2e68697454657374286d6f7573652929207b0a202020202020202020202020686974203d20747275653b0a202020202020202020202020627265616b3b0a20202020202020207d0a202020207d0a20202020646f63756d656e742e626f64792e7374796c652e637572736f72203d20686974203f2027706f696e74657227203a202764656661756c74273b0a7d0a0a66756e6374696f6e206d6f757365446f776e286529207b0a2020202076617220692c206c656e3b0a202020200a20202020666f72202869203d20302c206c656e203d2064726167506f696e74732e6c656e6774683b2069203c206c656e3b2069202029207b0a20202020202020206966202864726167506f696e74735b695d2e647261675374617274286d6f75736529292072657475726e3b0a202020207d0a202020200a20202020666f72202869203d20303b2069203c206c656e3b2069202029207b0a20202020202020206966202864726167506f696e74735b695d2e68697454657374286d6f7573652929207b0a202020202020202020202020696620286c656e203e2031292064726167506f696e74732e73706c69636528692c2031293b0a20202020202020202020202072657475726e3b0a20202020202020207d0a202020207d0a202020200a20202020696620286c656e203c20445241475f504f494e545f4d41585f4e554d29207b0a202020202020202064726167506f696e74732e70757368286e65772044726167506f696e7428652e636c69656e74582c20652e636c69656e745929293b0a202020207d20656c7365207b0a2020202020202020666f72202869203d20303b2069203c206c656e202d20323b2069202029207b0a20202020202020202020202064726167506f696e74735b695d2e6b696c6c28293b0a20202020202020207d0a202020207d0a7d0a0a66756e6374696f6e206d6f7573655570286529207b0a20202020666f7220287661722069203d20302c206c656e203d2064726167506f696e74732e6c656e6774683b2069203c206c656e3b2069202029207b0a202020202020202064726167506f696e74735b695d2e64726167456e64286d6f757365293b0a202020207d0a7d0a0a66756e6374696f6e20646f75626c65436c69636b286529207b0a20202020766172206c656e203d2064726167506f696e74732e6c656e6774683b0a20202020696620286c656e203c2033292072657475726e3b0a20202020666f7220287661722069203d20303b2069203c206c656e3b2069202029207b0a20202020202020206966202864726167506f696e74735b695d2e68697454657374286d6f7573652929207b0a20202020202020202020202064726167506f696e74735b695d2e6b696c6c28293b0a20202020202020202020202072657475726e3b0a20202020202020207d0a202020207d0a7d0a0a66756e6374696f6e206b6579446f776e286529207b0a2020202069662028652e6b6579436f6465203d3d3d20363829207b202f2f2064206b65790a202020202020202044656275672e656e61626c6564203d202144656275672e656e61626c65643b0a202020207d0a7d0a0a66756e6374696f6e206c6f6f702829207b0a20202020636f6e746578742e676c6f62616c436f6d706f736974654f7065726174696f6e203d2027736f757263652d6f766572273b0a20202020636f6e746578742e66696c6c5374796c65203d204241434b47524f554e445f434f4c4f523b0a20202020636f6e746578742e66696c6c5265637428302c20302c2063616e7661732e77696474682c2063616e7661732e686569676874293b0a202020200a20202020636f6e746578742e676c6f62616c436f6d706f736974654f7065726174696f6e203d20276c696768746572273b0a202020200a2020202076617220692c206c656e2c20703b0a202020200a2020202076617220636f6e74726f6c73203d205b5d3b0a20202020666f72202869203d20302c206c656e203d2064726167506f696e74732e6c656e6774683b2069203c206c656e3b2069202029207b0a202020202020202070203d2064726167506f696e74735b695d3b0a2020202020202020702e75706461746528293b0a2020202020202020702e616c706861203d20702e68697454657374286d6f75736529203f20302e3735203a20302e323b0a2020202020202020702e6472617728636f6e74657874293b0a202020202020202069662028702e6465616429207b0a20202020202020202020202064726167506f696e74732e73706c69636528692c2031293b0a202020202020202020202020692d2d3b0a2020202020202020202020206c656e2d2d3b0a202020202020202020202020636f6e74696e75653b0a20202020202020207d0a20202020202020206966202821702e6479696e6729207b0a202020202020202020202020636f6e74726f6c732e707573682870293b0a20202020202020207d0a202020207d0a202020200a202020202f2f20e58e9fe782b9e3818be38289e381aee8b79de99ba2e381a7e382bde383bce383880a20202020636f6e74726f6c732e736f727428736f7274506f696e7473293b0a202020200a20202020626173654c696e652e75706461746528636f6e74726f6c73293b0a202020200a202020206c696768746e696e674c696e652e75706461746528626173654c696e652e706f696e7473293b0a20202020647261774c696768746e696e67426c7572286c696768746e696e674c696e652c2035302c203330293b0a20202020647261774c696768746e696e674c696e65286c696768746e696e674c696e652c20302e37352c20312c20312c2035293b0a20202020647261774c696768746e696e67436170286c696768746e696e674c696e65293b0a202020200a202020206c696768746e696e674c696e652e656163684368696c642866756e6374696f6e286368696c642c206929207b0a2020202020202020647261774c696768746e696e674c696e65286368696c642c20302c20312c20302c2034293b0a2020202020202020647261774c696768746e696e67426c7572286368696c642c2035302c203330293b0a202020207d293b0a202020200a20202020436f6c6f722e6c203d2072616e646f6d52616e6765284c5f4d494e2c204c5f4d4158293b0a202020200a202020202f2f202a2064656275670a2020202044656275672e6578656328293b0a7d0a0a2f2f20417272617920736f72742063616c6c6261636b0a66756e6374696f6e20736f7274506f696e74732870312c20703229207b0a2020202072657475726e2070312e6c656e6774682829202d2070322e6c656e67746828293b0a7d0a0a0a2f2f204c696768746e696e672064726177206d6574686f64730a0a66756e6374696f6e20647261774c696768746e696e674c696e65286c696e652c206d6178416c7068612c206d696e416c7068612c206d61784c696e65572c206d696e4c696e655729207b0a20202020636f6e746578742e626567696e5061746828293b0a20202020636f6e746578742e7374726f6b655374796c65203d20436f6c6f722e736574416c706861546f537472696e672872616e646f6d52616e6765286d696e416c7068612c206d6178416c70686129293b0a20202020636f6e746578742e6c696e6557696474682020203d2072616e646f6d52616e6765286d696e4c696e65572c206d61784c696e6557293b0a202020206c696e652e65616368506f696e74732866756e6374696f6e28702c206929207b0a2020202020202020636f6e746578745b69203d3d3d2030203f20276d6f7665546f27203a20276c696e65546f275d28702e782c20702e79293b0a202020207d293b0a20202020636f6e746578742e7374726f6b6528293b0a7d0a0a66756e6374696f6e20647261774c696768746e696e67426c7572286c696e652c20626c75722c206d617853697a6529207b0a2020202076617220646973743b0a20202020636f6e746578742e7361766528293b0a20202020636f6e746578742e66696c6c5374796c65203d20277267626128302c20302c20302c203129273b0a20202020636f6e746578742e736861646f77426c7572203d20626c75723b0a20202020636f6e746578742e736861646f77436f6c6f72203d20436f6c6f722e736574416c706861546f537472696e6728293b0a20202020636f6e746578742e626567696e5061746828293b0a202020206c696e652e65616368506f696e74732866756e6374696f6e28702c20692c206c656e29207b0a202020202020202064697374203d206c656e203e2031203f20702e64697374616e636528746869735b69203d3d3d206c656e202d2031203f2069202d2031203a2069202020315d29203a20303b0a20202020202020206966202864697374203e206d617853697a65292064697374203d206d617853697a653b0a2020202020202020636f6e746578742e6d6f7665546f28702e78202020646973742c20702e79293b0a2020202020202020636f6e746578742e61726328702e782c20702e792c20646973742c20302c204d6174682e5049202a20322c2066616c7365293b0a202020207d293b0a20202020636f6e746578742e66696c6c28293b0a20202020636f6e746578742e726573746f726528293b0a7d0a0a66756e6374696f6e20647261774c696768746e696e67436170286c696e6529207b0a2020202076617220706f696e7473203d206c696e652e706f696e74733b0a2020202076617220702c207261646975732c206772616469656e743b0a20202020666f7220287661722069203d20302c206c656e203d20706f696e74732e6c656e6774683b2069203c206c656e3b206920203d206c656e202d203129207b0a202020202020202070203d20706f696e74735b695d3b0a2020202020202020726164697573203d2072616e646f6d52616e676528332c2038293b0a20202020202020206772616469656e74203d20636f6e746578742e63726561746552616469616c4772616469656e7428702e782c20702e792c20726164697573202f20332c20702e782c20702e792c20726164697573293b0a20202020202020206772616469656e742e616464436f6c6f7253746f7028302c20436f6c6f722e736574416c706861546f537472696e67283129293b0a20202020202020206772616469656e742e616464436f6c6f7253746f7028312c20436f6c6f722e736574416c706861546f537472696e67283029293b0a2020202020202020636f6e746578742e66696c6c5374796c65203d206772616469656e743b0a2020202020202020636f6e746578742e626567696e5061746828293b0a2020202020202020636f6e746578742e61726328702e782c20702e792c207261646975732c20302c204d6174682e5049202a20322c2066616c7365293b0a2020202020202020636f6e746578742e66696c6c28293b0a202020207d0a7d0a0a0a2f2f2048656c7065720a0a66756e6374696f6e2072616e646f6d52616e6765286d696e2c206d617829207b0a2020202072657475726e2072616e646f6d2829202a20286d6178202d206d696e292020206d696e3b0a7d0a0a0a2866756e6374696f6e2877696e646f7729207b0a202020202f2f5065726c696e4e6f6973652e757365436c6173736963203d20747275653b0a20202020766172207065726c696e4e6f697365203d206e6577205065726c696e4e6f69736528293b0a202020207065726c696e4e6f6973652e6f6374617665732833293b0a202020200a202020202f2a2a0a20202020202a204e6f6973654c696e650a20202020202a200a20202020202a2040706172616d207365676d656e74734e756d20e588b6e5bea1e782b9e99693e381aee58886e589b2e695b00a20202020202a2040706172616d206e6f6973654f7074696f6e7320e3838ee382a4e382bae381aee382aae38397e382b7e383a7e383b30a20202020202a2f0a2020202066756e6374696f6e204e6f6973654c696e65287365676d656e74734e756d2c206e6f6973654f7074696f6e7329207b0a2020202020202020746869732e7365676d656e74734e756d203d207365676d656e74734e756d3b0a0a2020202020202020746869732e6e6f6973654f7074696f6e73203d20657874656e64287b0a202020202020202020202020626173653a2033302c0a202020202020202020202020616d706c69747564653a20302e352c0a20202020202020202020202073706565643a20302e3030322c0a2020202020202020202020206f66667365743a20300a20202020202020207d2c206e6f6973654f7074696f6e73293b0a0a2020202020202020746869732e706f696e7473203d205b5d3b0a2020202020202020746869732e6c696e654c656e677468203d20303b0a2020202020202020746869732e6368696c6472656e203d205b5d3b0a202020207d0a0a202020204e6f6973654c696e652e70726f746f74797065203d207b0a20202020202020206372656174654368696c643a2066756e6374696f6e286e6f6973654f7074696f6e7329207b0a202020202020202020202020766172206368696c64203d206e6577204e6f6973654c696e654368696c6428746869732c206e6f6973654f7074696f6e73207c7c20746869732e6e6f6973654f7074696f6e73293b0a202020202020202020202020746869732e6368696c6472656e2e70757368286368696c64293b0a20202020202020202020202072657475726e206368696c643b0a20202020202020207d2c0a20202020202020200a2020202020202020656163684368696c643a2066756e6374696f6e2863616c6c6261636b29207b0a202020202020202020202020766172206368696c6472656e203d20746869732e6368696c6472656e3b0a202020202020202020202020666f7220287661722069203d20302c206c656e203d206368696c6472656e2e6c656e6774683b2069203c206c656e3b2069202029207b0a2020202020202020202020202020202063616c6c6261636b2e63616c6c286368696c6472656e2c206368696c6472656e5b695d2c20692c206c656e293b0a2020202020202020202020207d0a20202020202020207d2c0a0a202020202020202065616368506f696e74733a2066756e6374696f6e2863616c6c6261636b29207b0a20202020202020202020202076617220706f696e7473203d20746869732e706f696e74733b0a202020202020202020202020666f7220287661722069203d20302c206c656e203d20706f696e74732e6c656e6774683b2069203c206c656e3b2069202029207b0a2020202020202020202020202020202063616c6c6261636b2e63616c6c28706f696e74732c20706f696e74735b695d2c20692c206c656e293b0a2020202020202020202020207d0a20202020202020207d2c0a0a20202020202020207570646174653a2066756e6374696f6e28636f6e74726f6c7329207b0a20202020202020202020202076617220692c206c656e3b0a2020202020202020202020200a2020202020202020202020202f2f20e68cafe3828ae5b985e381aee4bf82e695b0e381a8e38197e381a6e4bdbfe794a8e38199e3828be3819fe38281e588b6e5bea1e782b9e38292e585a8e381a6e79bb4e7b79ae381a7e7b590e38293e381a0e8b79de99ba2e38292e58f96e5be97e38199e3828b0a202020202020202020202020766172206c696e654c656e677468203d20303b0a202020202020202020202020666f72202869203d20302c206c656e203d20636f6e74726f6c732e6c656e6774683b2069203c206c656e3b2069202029207b0a202020202020202020202020202020206966202869203d3d3d206c656e202d20312920627265616b3b0a202020202020202020202020202020206c696e654c656e67746820203d20636f6e74726f6c735b695d2e64697374616e636528636f6e74726f6c735b69202020315d293b0a2020202020202020202020207d0a202020202020202020202020746869732e6c696e654c656e677468203d206c696e654c656e6774683b0a2020202020202020202020200a2020202020202020202020202f2f20e382b9e38397e383a9e382a4e383b3e69bb2e7b79ae38292e7949fe68890e38197e381a6e3838ee382a4e382bae38292e981a9e794a80a202020202020202020202020746869732e6e6f6973652873706c696e6528636f6e74726f6c732c20746869732e7365676d656e74734e756d292c206c696e654c656e677468293b0a2020202020202020202020200a2020202020202020202020202f2f202a2a2a2044656275670a2020202020202020202020206966202844656275672e656e61626c656420262620746869732e646562756729207b0a20202020202020202020202020202020746869732e65616368506f696e74732866756e6374696f6e28702c206929207b0a202020202020202020202020202020202020202044656275672e616464436f6d6d616e642866756e6374696f6e2829207b2044656275672e706f696e7428702e782c20702e792c20332c2027626c756527293b207d293b0a202020202020202020202020202020207d293b0a2020202020202020202020207d0a2020202020202020202020202f2f202a2a2a2a2a2a2a2a2a0a2020202020202020202020200a2020202020202020202020202f2f20e69c80e79fade8b79de99ba2e38292e58f96e5be970a202020202020202020202020746869732e706f696e7473203d2073686f727465737428746869732e706f696e7473293b0a2020202020202020202020200a2020202020202020202020202f2f202a2a2a2044656275670a2020202020202020202020206966202844656275672e656e61626c656420262620746869732e646562756729207b0a20202020202020202020202020202020746869732e65616368506f696e74732866756e6374696f6e28702c206929207b0a202020202020202020202020202020202020202044656275672e616464436f6d6d616e642866756e6374696f6e2829207b2044656275672e706f696e7428702e782c20702e792c20332c202772656427293b207d293b0a202020202020202020202020202020207d293b0a2020202020202020202020207d0a2020202020202020202020202f2f202a2a2a2a2a2a2a2a2a0a2020202020202020202020200a2020202020202020202020202f2f20e5ad90e38292e69bb4e696b00a202020202020202020202020766172206368696c6472656e203d20746869732e6368696c6472656e3b0a202020202020202020202020666f72202869203d20302c206c656e203d206368696c6472656e2e6c656e6774683b2069203c206c656e3b2069202029207b0a202020202020202020202020202020206368696c6472656e5b695d2e75706461746528293b0a2020202020202020202020207d0a20202020202020207d2c0a20202020202020200a20202020202020206e6f6973653a2066756e6374696f6e2862617365732c2072616e676529207b0a20202020202020202020202076617220706f696e74734f6c64203d20746869732e706f696e74733b0a20202020202020202020202076617220706f696e7473203d20746869732e706f696e7473203d205b5d3b0a2020202020202020202020200a202020202020202020202020766172206f707473203d20746869732e6e6f6973654f7074696f6e733b0a2020202020202020202020207661722062617365203d206f7074732e626173653b0a20202020202020202020202076617220616d70203d206f7074732e616d706c69747564653b0a202020202020202020202020766172207370656564203d206f7074732e73706565643b0a202020202020202020202020766172206f6666736574203d206f7074732e6f666673657420203d2072616e646f6d2829202a2073706565643b0a2020202020202020202020200a20202020202020202020202076617220702c206e6578742c20616e676c652c2073696e2c20636f732c2061762c2061782c2061792c2062762c2062782c2062792c206d2c2070782c2070793b0a2020202020202020202020200a202020202020202020202020666f7220287661722069203d20302c206c656e203d2062617365732e6c656e6774683b2069203c206c656e3b2069202029207b0a2020202020202020202020202020202070203d2062617365735b695d3b0a202020202020202020202020202020206e657874203d2069203d3d3d206c656e202d2031203f2070203a2062617365735b69202020315d3b0a0a20202020202020202020202020202020616e676c65203d206e6578742e73756274726163742870292e616e676c6528293b0a2020202020202020202020202020202073696e203d204d6174682e73696e28616e676c65293b0a20202020202020202020202020202020636f73203d204d6174682e636f7328616e676c65293b0a202020202020202020202020202020200a202020202020202020202020202020206176203d2072616e6765202a207065726c696e4e6f6973652e6e6f6973652869202f2062617365202d206f66667365742c206f666673657429202a20302e35202a20616d703b0a202020202020202020202020202020206178203d206176202a2073696e3b0a202020202020202020202020202020206179203d206176202a20636f733b0a0a202020202020202020202020202020206276203d2072616e6765202a207065726c696e4e6f6973652e6e6f6973652869202f20626173652020206f66667365742c206f666673657429202a20302e35202a20616d703b0a202020202020202020202020202020206278203d206276202a2073696e3b0a202020202020202020202020202020206279203d206276202a20636f733b0a0a202020202020202020202020202020206d203d204d6174682e73696e284d6174682e5049202a202869202f20286c656e202d20312929293b0a0a202020202020202020202020202020207078203d20702e78202020286178202d20627829202a206d3b0a202020202020202020202020202020207079203d20702e79202d20286179202d20627929202a206d3b0a0a20202020202020202020202020202020706f696e74732e7075736828706f696e74734f6c642e6c656e677468203f20706f696e74734f6c642e736869667428292e7365742870782c20707929203a206e657720506f696e742870782c20707929293b0a202020202020202020202020202020200a202020202020202020202020202020202f2f202a2a2a2044656275670a202020202020202020202020202020206966202844656275672e656e61626c656420262620746869732e646562756729207b0a202020202020202020202020202020202020202044656275672e616464436f6d6d616e64282866756e6374696f6e28702c20616e676c6529207b0a20202020202020202020202020202020202020202020202072657475726e2066756e6374696f6e2829207b0a20202020202020202020202020202020202020202020202020202020636f6e746578742e7361766528293b0a20202020202020202020202020202020202020202020202020202020636f6e746578742e7472616e736c61746528702e782c20702e79293b0a20202020202020202020202020202020202020202020202020202020636f6e746578742e726f7461746528616e676c65293b0a20202020202020202020202020202020202020202020202020202020746869732e6c696e6528302c20302c2031353939392c20393939302c202770696e6b272c2031293b0a20202020202020202020202020202020202020202020202020202020746869732e706f696e7428302c20302c20322c202770696e6b27293b0a20202020202020202020202020202020202020202020202020202020636f6e746578742e726573746f726528293b0a2020202020202020202020202020202020202020202020207d3b0a20202020202020202020202020202020202020207d2928702c20616e676c6529293b0a202020202020202020202020202020207d0a202020202020202020202020202020202f2f202a2a2a2a2a2a2a2a2a0a2020202020202020202020207d0a20202020202020207d0a202020207d3b0a0a0a202020202f2a2a0a20202020202a204e6f6973654c696e654368696c640a20202020202a200a20202020202a20407375706572204e6f6973654c696e650a20202020202a2f0a2020202066756e6374696f6e204e6f6973654c696e654368696c6428706172656e742c206e6f6973654f7074696f6e7329207b0a2020202020202020746869732e706172656e74203d206c696768746e696e674c696e653b0a2020202020202020746869732e5f6c6173744368616e676554696d65203d20303b0a20202020202020204e6f6973654c696e652e63616c6c28746869732c20302c206e6f6973654f7074696f6e73207c7c206c696768746e696e674c696e652e6e6f6973654f7074696f6e73293b0a202020207d0a0a202020204e6f6973654c696e654368696c642e70726f746f74797065203d20657874656e64287b7d2c204e6f6973654c696e652e70726f746f747970652c207b0a20202020202020207374617274537465703a20302c0a2020202020202020656e64537465703a20302c0a20202020202020200a20202020202020202f2f20436c65617220737570657220636c617373206d6574686f64730a20202020202020206372656174654368696c643a20756e646566696e65642c0a2020202020202020656163684368696c643a20756e646566696e65642c0a0a20202020202020207570646174653a2066756e6374696f6e2829207b0a20202020202020202020202076617220706172656e74203d20746869732e706172656e743b0a20202020202020202020202076617220706c656e203d20706172656e742e706f696e74732e6c656e6774683b0a0a2020202020202020202020202f2f20e4b880e5ae9ae69982e99693e38194e381a82c20e38182e3828be38184e381afe8a6aae381aee3839de382a4e383b3e38388e381aee695b0e3818ce5ad90e381aee7b582e4ba86e382b9e38386e38383e38397e4bd8de7bdaee38292e4b88be59b9ee381a3e3819fe5a0b4e59088e381abe5a78be782b9e381a8e7b582e782b9e381aee8a6aae3818be38289e381aee58f96e5be97e4bd8de7bdaee38292e69bb4e696b0e38199e3828b0a2020202020202020202020207661722063757272656e7454696d65203d206e6577204461746528292e67657454696d6528293b0a202020202020202020202020696620280a2020202020202020202020202020202063757272656e7454696d65202d20746869732e5f6c6173744368616e676554696d65203e203130303030202a2072616e646f6d28290a202020202020202020202020202020207c7c20706c656e203c20746869732e656e64537465700a20202020202020202020202029207b0a2020202020202020202020202020202076617220737465704d696e203d20666c6f6f7228706c656e202f203130293b0a2020202020202020202020202020202076617220737461727453746570203d20746869732e737461727453746570203d20666c6f6f722872616e646f6d2829202a20666c6f6f7228706c656e202f2033202a203229293b0a20202020202020202020202020202020746869732e656e6453746570203d20737461727453746570202020737465704d696e202020666c6f6f722872616e646f6d2829202a2028706c656e202d20737461727453746570202d20737465704d696e2920202031293b0a20202020202020202020202020202020746869732e5f6c6173744368616e676554696d65203d2063757272656e7454696d653b0a2020202020202020202020207d0a0a2020202020202020202020202f2f20e8a6aae381aee3839de382a4e383b3e38388e9858de58897e3818be38289e58f96e5be97e7af84e59bb2e38292e58887e3828ae587bae381990a2020202020202020202020207661722072616e6765203d20706172656e742e706f696e74732e736c69636528746869732e7374617274537465702c20746869732e656e6453746570293b0a2020202020202020202020207661722072616e67654c656e203d2072616e67652e6c656e6774683b0a2020202020202020202020200a2020202020202020202020202f2f20e7af84e59bb2e3818be38289e382b9e38397e383a9e382a4e383b3e69bb2e7b79ae381aee588b6e5bea1e782b9e38292e58f96e5be97e38199e3828b0a20202020202020202020202076617220736570203d20323b202f2f20e58886e589b2e695b00a20202020202020202020202076617220736567203d202872616e67654c656e202d203129202f207365703b0a20202020202020202020202076617220636f6e74726f6c73203d205b5d3b0a20202020202020202020202076617220692c206a3b0a202020202020202020202020666f72202869203d20303b2069203c3d207365703b2069202029207b0a202020202020202020202020202020206a203d204d6174682e666c6f6f7228736567202a2069293b0a20202020202020202020202020202020636f6e74726f6c732e707573682872616e67655b6a5d293b0a2020202020202020202020207d0a2020202020202020202020200a2020202020202020202020202f2f202a2a2a2044656275670a2020202020202020202020206966202844656275672e656e61626c656429207b0a202020202020202020202020202020202866756e6374696f6e2829207b0a2020202020202020202020202020202020202020666f7220287661722069203d20302c206c656e203d20636f6e74726f6c732e6c656e677468202d20312c20702c206e3b2069203c206c656e3b2069202029207b0a20202020202020202020202020202020202020202020202070203d20636f6e74726f6c735b695d3b0a20202020202020202020202020202020202020202020202044656275672e616464436f6d6d616e64282866756e6374696f6e287029207b0a2020202020202020202020202020202020202020202020202020202072657475726e2066756e6374696f6e2829207b2044656275672e706f696e7428702e782c20702e792c20332c202779656c6c6f7727293b207d3b0a2020202020202020202020202020202020202020202020207d29287029293b0a20202020202020202020202020202020202020207d0a202020202020202020202020202020207d2928293b0a2020202020202020202020207d0a2020202020202020202020202f2f202a2a2a2a2a2a2a2a2a0a2020202020202020202020200a2020202020202020202020202f2f20e382b9e38397e383a9e382a4e383b3e69bb2e7b79ae38292e7949fe688900a2020202020202020202020207661722062617365203d2073706c696e6528636f6e74726f6c732c204d6174682e666c6f6f722872616e67654c656e202f203329293b0a2020202020202020202020200a2020202020202020202020202f2f202a2a2a2044656275670a2020202020202020202020206966202844656275672e656e61626c656429207b0a202020202020202020202020202020202866756e6374696f6e2829207b0a2020202020202020202020202020202020202020666f7220287661722069203d20302c206c656e203d20626173652e6c656e677468202d20312c20702c206e3b2069203c206c656e3b2069202029207b0a20202020202020202020202020202020202020202020202070203d20626173655b695d3b0a2020202020202020202020202020202020202020202020206e203d20626173655b6920202035305d3b0a20202020202020202020202020202020202020202020202044656275672e616464436f6d6d616e64282866756e6374696f6e28702c206e29207b0a2020202020202020202020202020202020202020202020202020202072657475726e2066756e6374696f6e2829207b2044656275672e6c696e6528702e782c20702e792c206e2e782c206e2e792c202779656c6c6f77272c2031293b207d3b0a2020202020202020202020202020202020202020202020207d2928702c206e29293b0a20202020202020202020202020202020202020207d0a202020202020202020202020202020207d2928293b0a2020202020202020202020207d0a2020202020202020202020202f2f202a2a2a2a2a2a2a2a2a0a2020202020202020202020200a2020202020202020202020202f2f20e3838ee382a4e382bae38292e981a9e794a80a202020202020202020202020746869732e6e6f69736528626173652c20636f6e74726f6c735b305d2e64697374616e636528636f6e74726f6c735b325d29293b0a2020202020202020202020202f2f20e69c80e79fade8b79de99ba2e38292e58f96e5be970a202020202020202020202020746869732e706f696e7473203d2073686f727465737428746869732e706f696e7473293b0a20202020202020207d0a202020207d293b0a202020200a2020202066756e6374696f6e2073706c696e6528636f6e74726f6c732c207365676d656e74734e756d29207b0a20202020202020202f2f20e382b9e38397e383a9e382a4e383b3e8a39ce5ae8ce794a8e381abe9858de58897e381aee5898de5be8ce381abe383a9e382a4e383b3e381aee5a78be782b92c20e7b582e782b9e381aee58f82e785a7e38292e3819de3828ce3819ee3828ce8a487e8a3bde38199e3828b0a2020202020202020636f6e74726f6c732e756e736869667428636f6e74726f6c735b305d293b0a2020202020202020636f6e74726f6c732e7075736828636f6e74726f6c735b636f6e74726f6c732e6c656e677468202d20315d293b0a0a20202020202020202f2f20e382b9e38397e383a9e382a4e383b3e69bb2e7b79ae381aee3839de382a4e383b3e38388e38292e58f96e5be970a202020202020202076617220706f696e7473203d205b5d3b0a20202020202020207661722070302c2070312c2070322c2070332c20743b0a2020202020202020766172206a3b0a2020202020202020666f7220287661722069203d20302c206c656e203d20636f6e74726f6c732e6c656e677468202d20333b2069203c206c656e3b2069202029207b0a2020202020202020202020207030203d20636f6e74726f6c735b695d3b0a2020202020202020202020207031203d20636f6e74726f6c735b69202020315d3b0a2020202020202020202020207032203d20636f6e74726f6c735b69202020325d3b0a2020202020202020202020207033203d20636f6e74726f6c735b69202020335d3b0a2020202020202020202020200a202020202020202020202020666f7220286a203d20303b206a203c207365676d656e74734e756d3b206a202029207b0a2020202020202020202020202020202074203d20286a2020203129202f207365676d656e74734e756d3b0a202020202020202020202020202020200a20202020202020202020202020202020706f696e74732e70757368286e657720506f696e74280a20202020202020202020202020202020202020206361746d756c6c526f6d2870302e782c2070312e782c2070322e782c2070332e782c2074292c0a20202020202020202020202020202020202020206361746d756c6c526f6d2870302e792c2070312e792c2070322e792c2070332e792c2074290a2020202020202020202020202020202029293b0a2020202020202020202020207d0a20202020202020207d0a0a20202020202020202f2f20e8a39ce5ae8ce794a8e381abe8bfbde58aa0e38197e3819fe58f82e785a7e38292e5898ae999a40a2020202020202020636f6e74726f6c732e706f7028293b0a20202020202020202f2f20e5898ae999a4e381aee381a4e38184e381a7e381abe68f8fe794bbe381aee5a78be782b9e381a8e38197e381a6e8bfbde58aa00a2020202020202020706f696e74732e756e736869667428636f6e74726f6c732e73686966742829293b0a20202020202020200a202020202020202072657475726e20706f696e74733b0a202020207d0a202020200a202020202f2a2a0a20202020202a204361746d756c6c2d526f6d2053706c696e652043757276650a20202020202a200a20202020202a204073656520687474703a2f2f6c30306f6f2e6f6f30306c2e636f6d2f626c6f672f61726368697665732f3236340a20202020202a2f0a2020202066756e6374696f6e206361746d756c6c526f6d2870302c2070312c2070322c2070332c207429207b0a2020202020202020766172207630203d20287032202d20703029202f20323b0a2020202020202020766172207631203d20287033202d20703129202f20323b0a202020202020202072657475726e202832202a207031202d2032202a2070322020207630202020763129202a2074202a2074202a20740a2020202020202020202020202020282d33202a20703120202033202a207032202d2032202a207630202d20763129202a2074202a20742020207630202a207420202070313b0a202020207d0a202020200a2020202066756e6374696f6e2073686f727465737428626173657329207b0a202020202020202076617220706f696e7473203d205b62617365735b305d5d3b0a202020202020202076617220702c206a2c2070322c20646973742c206d696e446973742c206b3b0a2020202020202020666f7220287661722069203d20302c206c656e203d2062617365732e6c656e6774683b2069203c206c656e3b2069202029207b0a20202020202020202020202070203d2062617365735b695d3b0a0a2020202020202020202020206d696e44697374203d20496e66696e6974793b0a2020202020202020202020206b203d202d313b0a202020202020202020202020666f7220286a203d20693b206a203c206c656e3b206a202029207b0a2020202020202020202020202020202069662028287032203d2062617365735b6a5d2920213d3d2070202626202864697374203d20702e64697374616e63652870322929203c206d696e4469737429207b0a20202020202020202020202020202020202020206d696e44697374203d20646973743b0a20202020202020202020202020202020202020206b203d206a3b0a202020202020202020202020202020207d0a2020202020202020202020207d0a202020202020202020202020696620286b203c20302920627265616b3b0a0a202020202020202020202020706f696e74732e707573682862617365735b6b5d293b0a20202020202020202020202069203d206b202d20313b0a20202020202020207d0a0a202020202020202072657475726e20706f696e74733b0a202020207d0a202020200a2020202077696e646f772e4e6f6973654c696e65203d204e6f6973654c696e653b0a202020200a7d292877696e646f77293b0a0a0a2f2a2a0a202a2044726167506f696e740a202a200a202a2040737570657220506f696e7420687474703a2f2f6a73646f2e69742f616b6d322f66684d430a202a2f0a66756e6374696f6e2044726167506f696e7428782c207929207b0a20202020746869732e78203d20783b0a20202020746869732e79203d20793b0a20202020746869732e726164697573203d2035303b0a20202020746869732e616c706861203d20302e323b0a20202020746869732e6472616767696e67203d2066616c73653b0a20202020746869732e6479696e67203d2066616c73653b0a20202020746869732e64656164203d2066616c73653b0a202020200a20202020746869732e5f76203d206e657720506f696e742872616e646f6d52616e6765282d332c2033292c2072616e646f6d52616e6765282d332c203329293b0a202020200a20202020746869732e5f6d6f757365203d206e756c6c3b0a20202020746869732e5f6c61746573744d6f757365203d206e657720506f696e7428293b0a20202020746869732e5f6d6f75736544697374203d206e756c6c3b0a202020200a20202020746869732e5f63757272656e74416c706861203d20303b0a20202020746869732e5f63757272656e74526164697573203d20303b0a7d0a0a44726167506f696e742e70726f746f74797065203d20657874656e64287b7d2c20506f696e742e70726f746f747970652c207b0a20202020686974546573743a2066756e6374696f6e286d6f75736529207b0a202020202020202072657475726e20746869732e64697374616e6365286d6f75736529203c20746869732e7261646975733b0a202020207d2c0a0a202020206472616753746172743a2066756e6374696f6e286d6f75736529207b0a202020202020202069662028746869732e68697454657374286d6f7573652929207b0a202020202020202020202020746869732e5f6d6f757365203d206d6f7573653b0a202020202020202020202020746869732e5f6d6f75736544697374203d20746869732e737562747261637428746869732e5f6d6f757365293b0a202020202020202020202020746869732e6472616767696e67203d20747275653b0a20202020202020207d0a202020202020202072657475726e20746869732e6472616767696e673b0a202020207d2c0a0a2020202064726167456e643a2066756e6374696f6e2829207b20202020202020200a202020202020202069662028746869732e6472616767696e6720262620746869732e5f6c61746573744d6f75736529207b0a202020202020202020202020746869732e5f762e73657428746869732e5f6d6f7573652e737562747261637428746869732e5f6c61746573744d6f75736529293b0a20202020202020207d0a2020202020202020746869732e6472616767696e67203d2066616c73653b0a2020202020202020746869732e5f6d6f757365203d20746869732e5f6d6f75736544697374203d206e756c6c3b0a202020207d2c0a202020200a202020206b696c6c3a2066756e6374696f6e2829207b0a2020202020202020746869732e6479696e67203d20747275653b0a2020202020202020746869732e726164697573203d20303b0a202020207d2c0a0a202020207570646174653a2066756e6374696f6e286d6f75736529207b0a20202020202020207661722076203d20746869732e5f763b0a20202020202020200a202020202020202069662028746869732e5f6d6f75736529207b0a202020202020202020202020746869732e73657428746869732e5f6d6f7573652e61646428746869732e5f6d6f7573654469737429293b0a202020202020202020202020746869732e5f6c61746573744d6f7573652e73657428746869732e5f6d6f757365293b0a20202020202020207d20656c7365207b0a202020202020202020202020746869732e6f66667365742876293b0a202020202020202020202020762e78202a3d20302e39373b0a202020202020202020202020762e79202a3d20302e39373b0a2020202020202020202020200a20202020202020202020202076617220766c656e203d20762e6c656e67746828293b0a20202020202020202020202069662028766c656e203e20333029207b0a20202020202020202020202020202020762e6e6f726d616c697a65283330293b0a2020202020202020202020207d20656c73652069662028766c656e203c203129207b0a20202020202020202020202020202020762e6e6f726d616c697a652831293b0a2020202020202020202020207d0a20202020202020207d0a20202020202020200a202020202020202076617220726164697573203d20746869732e7261646975733b0a0a202020202020202069662028746869732e78203c2072616469757329207b0a202020202020202020202020746869732e78203d20746869732e7261646975733b0a20202020202020202020202069662028762e78203c20302920762e78202a3d202d313b0a20202020202020207d20656c73652069662028746869732e78203e2063616e7661732e7769647468202d2072616469757329207b0a202020202020202020202020746869732e78203d2063616e7661732e7769647468202d207261646975733b0a20202020202020202020202069662028762e78203e20302920762e78202a3d202d313b0a20202020202020207d0a0a202020202020202069662028746869732e79203c2072616469757329207b0a202020202020202020202020746869732e79203d207261646975733b0a20202020202020202020202069662028762e79203c20302920762e79202a3d202d313b0a20202020202020207d20656c73652069662028746869732e79203e2063616e7661732e686569676874202d2072616469757329207b0a202020202020202020202020746869732e79203d2063616e7661732e686569676874202d207261646975733b0a20202020202020202020202069662028762e79203e20302920762e79202a3d202d313b0a20202020202020207d0a20202020202020200a202020202020202076617220643b0a20202020202020202f2f20416c7068610a202020202020202064203d20746869732e616c706861202d20746869732e5f63757272656e74416c7068613b0a2020202020202020696620282864203c2030203f202d64203a206429203e20302e3030312920746869732e5f63757272656e74416c70686120203d2064202a20302e313b0a20202020202020202f2f205261646975730a202020202020202064203d20726164697573202d20746869732e5f63757272656e745261646975733b0a2020202020202020696620282864203c2030203f202d64203a206429203e20302e303129207b0a202020202020202020202020746869732e5f63757272656e7452616469757320203d2064202a20302e33353b0a20202020202020207d20656c73652069662028746869732e6479696e6729207b0a202020202020202020202020746869732e64656164203d20747275653b0a20202020202020207d0a2020202020202020746869732e5f63757272656e74526164697573202a3d2072616e646f6d52616e676528302e392c2031293b0a202020207d2c0a0a20202020647261773a2066756e6374696f6e2863747829207b0a202020202020202076617220726164697573203d20746869732e5f63757272656e745261646975733b0a2020202020202020766172206772616469656e74203d206374782e63726561746552616469616c4772616469656e7428746869732e782c20746869732e792c20726164697573202f20332c20746869732e782c20746869732e792c20726164697573293b0a20202020202020206772616469656e742e616464436f6c6f7253746f7028302c20436f6c6f722e736574416c706861546f537472696e6728746869732e5f63757272656e74416c70686129293b0a20202020202020206772616469656e742e616464436f6c6f7253746f7028312c20436f6c6f722e736574416c706861546f537472696e67283029293b0a20202020202020206374782e66696c6c5374796c65203d206772616469656e743b0a20202020202020206374782e626567696e5061746828293b0a20202020202020206374782e6d6f7665546f28746869732e782020207261646975732c20746869732e79293b0a20202020202020206374782e61726328746869732e782c20746869732e792c207261646975732c20302c204d6174682e5049202a20322c2066616c7365293b0a20202020202020206374782e66696c6c28293b0a202020207d0a7d293b0a0a0a2f2a2a0a202a20436f6c6f720a202a2f0a76617220436f6c6f72203d206e65772066756e6374696f6e2829207b0a20202020746869732e68203d20483b0a20202020746869732e73203d20533b0a20202020746869732e6c203d204c5f4d41583b0a202020200a20202020746869732e736574416c706861546f537472696e67203d2066756e6374696f6e28616c70686129207b0a202020202020202069662028747970656f6620616c706861203d3d3d2027756e646566696e656427207c7c20616c706861203d3d3d206e756c6c29207b0a20202020202020202020202072657475726e202768736c2827202020746869732e68202020272c2027202020746869732e7320202027252c2027202020746869732e6c202020272529273b0a20202020202020207d0a202020202020202072657475726e202768736c612827202020746869732e68202020272c2027202020746869732e7320202027252c2027202020746869732e6c20202027252c2027202020616c7068612020202729273b0a202020207d3b0a7d3b0a0a0a2f2f20496e69740a0a77696e646f772e6f6e6c6f6164203d2066756e6374696f6e2829207b0a20202020696e697428293b0a7d3b0a0a0a2f2f20e383a1e382a4e383b3e382b9e382afe383aae38397e38388e38193e38193e381bee381a70a0a2f2f2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a2f2f2044454255470a2f2f2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a766172204465627567203d207b0a20202020656e61626c65643a2066616c73652c0a202020205f636f6d6d616e64733a205b5d2c0a202020200a20202020616464436f6d6d616e643a2066756e6374696f6e28666e29207b0a202020202020202069662028746869732e656e61626c65642920746869732e5f636f6d6d616e64732e7075736828666e293b0a202020207d2c0a202020200a20202020657865633a2066756e6374696f6e2829207b0a202020202020202069662028746869732e656e61626c656429207b0a20202020202020202020202076617220636f6d6d616e6473203d20746869732e5f636f6d6d616e64733b0a202020202020202020202020666f7220287661722069203d20302c206c656e203d20636f6d6d616e64732e6c656e6774683b2069203c206c656e3b2069202029207b0a20202020202020202020202020202020636f6d6d616e64735b695d2e63616c6c2874686973293b0a2020202020202020202020207d0a202020202020202020202020746869732e5f636f6d6d616e6473203d205b5d3b0a20202020202020207d0a202020207d2c0a202020200a202020206c696e653a2066756e6374696f6e2878312c2079312c2078322c2079322c20636f6c6f722c206c696e65576964746829207b0a202020202020202069662028746869732e656e61626c656429207b0a202020202020202020202020636f6e746578742e7361766528293b0a202020202020202020202020636f6e746578742e676c6f62616c436f6d706f736974654f7065726174696f6e203d2027736f757263652d6f766572273b0a202020202020202020202020636f6e746578742e7374726f6b655374796c65203d20636f6c6f723b0a202020202020202020202020636f6e746578742e6c696e655769647468203d20216c696e655769647468203f2031203a206c696e6557696474683b0a202020202020202020202020636f6e746578742e626567696e5061746828293b0a202020202020202020202020636f6e746578742e6d6f7665546f2878312c207931293b0a202020202020202020202020636f6e746578742e6c696e65546f2878322c207932293b0a202020202020202020202020636f6e746578742e7374726f6b6528293b0a202020202020202020202020636f6e746578742e726573746f726528293b0a20202020202020207d0a202020207d2c0a202020200a20202020706f696e743a2066756e6374696f6e28782c20792c207261646975732c20636f6c6f7229207b0a202020202020202069662028746869732e656e61626c656429207b0a202020202020202020202020636f6e746578742e7361766528293b0a202020202020202020202020636f6e746578742e676c6f62616c436f6d706f736974654f7065726174696f6e203d2027736f757263652d6f766572273b0a202020202020202020202020636f6e746578742e66696c6c5374796c65203d20636f6c6f723b0a202020202020202020202020636f6e746578742e626567696e5061746828293b0a202020202020202020202020636f6e746578742e61726328782c20792c207261646975732c20302c204d6174682e5049202a20322c2066616c7365293b0a202020202020202020202020636f6e746578742e66696c6c28293b0a202020202020202020202020636f6e746578742e726573746f726528293b0a20202020202020207d0a202020207d0a7d3b0a3c2f7363726970743e
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement