Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Renderer
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: MIT pragma solidity ^0.8.12; import "./Trigonometry.sol"; import "./Utilities.sol"; import "hardhat/console.sol"; contract Renderer { uint256 constant SIZE = 500; uint256 constant RADIUS = 200; uint256 constant PRECISION_DEGREE = 7; uint256 constant PRECISION = 10**PRECISION_DEGREE; struct ColorPalette { uint256 primaryHue; uint256 secondaryHue; utils.HSL primaryColorHsl; utils.HSL secondaryColorHsl; utils.HSL backgroundColorHsl; utils.HSL darkerSecondaryHsl; utils.HSL[] primaryColorsHsl; utils.HSL[] secondaryColorsHsl; } struct Kaleidoscope { uint256 tokenId; uint256 repetitions; uint256 numInsideArtifacts; uint256 numOutsideArtifacts; uint256 centerX_precise; uint256 centerY_precise; bool hasGradient; bool hasSecondaryColor; bool hasHalo; } struct AnimatedCircle { // Start position int256 x1; int256 y1; // End position int256 x2; int256 y2; uint256 radius1; uint256 radius2; uint256 alternatingClass; uint256 duration; utils.HSL color; } struct AnimatedTriangle { uint256 x1; uint256 y1; uint256 centerX; uint256 centerY; uint256 duration; utils.HSL color; } struct AnimatedRectangle { uint256 width; uint256 height; uint256 x; uint256 y; uint256 duration; utils.HSL color; } function colorPaletteForKaleidescope(Kaleidoscope memory _kaleidoscope) public pure returns (ColorPalette memory palette) { palette.primaryHue = utils.randomRange(_kaleidoscope.tokenId, "primaryHue", 0, 360); palette.secondaryHue = _kaleidoscope.hasSecondaryColor ? (palette.primaryHue + 240) % 360 : palette.primaryHue; palette.primaryColorHsl = utils.HSL(palette.primaryHue, 100, 30); palette.secondaryColorHsl = utils.HSL(palette.secondaryHue, 100, 70); palette.backgroundColorHsl = utils.HSL(palette.primaryHue, 100, 10); palette.darkerSecondaryHsl = utils.HSL((palette.primaryHue + 10) % 360, 100, 10); palette.primaryColorsHsl = utils.generateColors(palette.primaryHue, _kaleidoscope.numInsideArtifacts + 1); palette.secondaryColorsHsl = utils.generateColors(palette.secondaryHue, _kaleidoscope.numInsideArtifacts + 1); return palette; } function kaleidoscopeForTokenId(uint256 _tokenId) public pure returns (Kaleidoscope memory kaleidoscope) { kaleidoscope.tokenId = _tokenId; kaleidoscope.repetitions = utils.randomRange(_tokenId, "repetitions", 3, 20); kaleidoscope.numInsideArtifacts = utils.randomRange(_tokenId, "numInsideArtifacts", 3, 10); kaleidoscope.numOutsideArtifacts = utils.randomRange(_tokenId, "numOutsideArtifacts", 1, 4); kaleidoscope.hasGradient = utils.randomRange(_tokenId, "hasGradient", 1, 10) == 5; kaleidoscope.hasSecondaryColor = utils.randomRange(_tokenId, "secondaryColor", 1, 8) == 8; uint256 angle = (((180 - 360 / kaleidoscope.repetitions) / 2) * Trigonometry.PI) / 180; kaleidoscope.centerX_precise = uint256( (int256(RADIUS) * Trigonometry.cos(angle)) / int256(10**(18 - PRECISION_DEGREE)) ); kaleidoscope.centerY_precise = uint256( (int256(RADIUS) * Trigonometry.sin(angle)) / int256(10**(18 - PRECISION_DEGREE)) ); return kaleidoscope; } function circleAtIndexForKaleidescope( Kaleidoscope memory _kaleidoscope, ColorPalette memory _palette, uint256 _index ) public pure returns (AnimatedCircle memory circle) { uint256 yUpperBound = (_kaleidoscope.centerY_precise / PRECISION) + RADIUS / 8; circle.y1 = int256( utils.randomRange(_kaleidoscope.tokenId, string.concat("y1", utils.uint2str(_index)), 20, yUpperBound) ); circle.y2 = int256( utils.randomRange(_kaleidoscope.tokenId, string.concat("y2", utils.uint2str(_index)), 20, yUpperBound) ); circle.alternatingClass = utils.randomRange( _kaleidoscope.tokenId, string.concat("alternatingClass", utils.uint2str(_index)), 0, 3 ); if (circle.y1 > circle.y2 && circle.alternatingClass % 2 == 0) { int256 temp = circle.y1; circle.y1 = circle.y2; circle.y2 = temp; } int256 gradient_1000 = int256((_kaleidoscope.centerY_precise * 1000) / _kaleidoscope.centerX_precise); uint256 radiusUB = (_kaleidoscope.centerX_precise / PRECISION) * 2; circle.radius1 = uint256( utils.min((radiusUB * (1000 - (uint256(circle.y1) * 1000) / yUpperBound)) / 1000, radiusUB) ); circle.radius2 = uint256( utils.min((radiusUB * (1000 - (uint256(circle.y2) * 1000) / yUpperBound)) / 1000, radiusUB) ); // x1 should be within bounds of triangular path int256 lb1 = (circle.y1 * 1000) / gradient_1000; circle.x1 = int256(lb1 - int256(circle.radius1) * 2); // x2 should be within bounds of triangular path int256 lb2 = (circle.y2 * 1000) / gradient_1000; circle.x2 = int256(2 * int256(_kaleidoscope.centerX_precise / PRECISION) - lb2 + int256(circle.radius2) * 2); circle.duration = utils.randomRange(_kaleidoscope.tokenId, string.concat("duration", utils.uint2str(_index)), 3, 7); circle.color = _index % 2 == 0 ? _palette.primaryColorsHsl[_index + 1] : _palette.secondaryColorsHsl[_index + 1]; return circle; } function rectangleAtIndexForKaleidescope( Kaleidoscope memory _kaleidoscope, ColorPalette memory _palette, uint256 _index ) public pure returns (AnimatedRectangle memory rectangle) { rectangle.width = utils.randomRange( _kaleidoscope.tokenId, string.concat("rectwidth", utils.uint2str(_index)), (_kaleidoscope.centerY_precise / PRECISION) / 2, (_kaleidoscope.centerY_precise / PRECISION) ); rectangle.height = utils.randomRange( _kaleidoscope.tokenId, string.concat("rectheight", utils.uint2str(_index)), (_kaleidoscope.centerY_precise / PRECISION), _kaleidoscope.centerY_precise * 2 + RADIUS / 8 ); rectangle.x = 0; rectangle.y = _kaleidoscope.centerY_precise / PRECISION; rectangle.duration = utils.randomRange( _kaleidoscope.tokenId, string.concat("rectduration", utils.uint2str(_index)), 5, 10 ); rectangle.color = _index % 2 == 0 ? _palette.primaryColorsHsl[0] : _palette.secondaryColorsHsl[0]; return rectangle; } function getCircleSVG(AnimatedCircle memory _circle) public pure returns (string memory) { string memory animations = string.concat( '<animate attributeName="r" values="', utils.uint2str(_circle.radius1), ";", utils.uint2str(_circle.radius2), ";", utils.uint2str(_circle.radius1), ";", utils.uint2str(_circle.radius2), '" calcMode="linear" dur="', utils.uint2str(_circle.duration * 2), 's" repeatCount="indefinite"/>' ); animations = string.concat( animations, '<animate attributeName="cy" values="', utils.int2str(_circle.y1), ";", utils.int2str(_circle.y2), ";", utils.int2str(_circle.y1), ";", utils.int2str(_circle.y2), '" calcMode="linear" dur="', utils.uint2str(_circle.duration * 2), 's" repeatCount="indefinite"/>' ); animations = string.concat( animations, '<animate attributeName="cx" values="', utils.int2str(_circle.x1), ";", utils.int2str(_circle.x2), ";", utils.int2str(_circle.x1), ";", utils.int2str(_circle.x2), '" calcMode="linear" dur="', utils.uint2str(_circle.duration * 2), 's" repeatCount="indefinite"/>' ); return string.concat( '<circle cx="', utils.int2str((_circle.x1 + _circle.x2) / 2), '" cy="', utils.int2str((_circle.y1 + _circle.y2) / 2), '" r="', utils.uint2str((_circle.radius1 + _circle.radius2) / 2), '" fill="', utils.getHslString(_circle.color), '">', animations, "</circle>" ); } function getRectangleSVG(AnimatedRectangle memory _rectangle) public pure returns (string memory) { string memory animations = string.concat( '<animateTransform attributeName="transform" type="rotate" from="0 0 -', utils.uint2str(_rectangle.y), '" to="-360 0 -', utils.uint2str(_rectangle.y), '" begin="0s" dur="', utils.uint2str(_rectangle.duration), 's" repeatCount="indefinite" />' ); return string.concat( '<rect rx="3" ry="3" x="0" y="-', utils.uint2str(_rectangle.y), '" width="', utils.uint2str(_rectangle.width), '" height="', utils.uint2str(_rectangle.height), '" fill="', utils.getHslString(_rectangle.color), '">', animations, "</rect>" ); } function linearGradient(string memory _stop1Color, string memory _stop2Color) internal pure returns (string memory) { return string.concat( '<linearGradient id="gradient">', '<stop offset="0%" stop-color="', _stop1Color, '"/>', '<stop offset="100%" stop-color="', _stop2Color, '"/>', "</linearGradient>" ); } function getKaleidoscopeSVG(Kaleidoscope memory _kaleidoscope, ColorPalette memory _palette) public pure returns (string memory) { // Get outer artifacts string memory outerArtifacts = ""; for (uint256 i = 0; i < _kaleidoscope.numOutsideArtifacts; i++) { // Rectangle AnimatedRectangle memory rectangle = rectangleAtIndexForKaleidescope(_kaleidoscope, _palette, i); outerArtifacts = string.concat(outerArtifacts, getRectangleSVG(rectangle)); } string memory innerArtifacts = ""; for (uint256 i = 0; i < _kaleidoscope.numInsideArtifacts; i++) { AnimatedCircle memory circle = circleAtIndexForKaleidescope(_kaleidoscope, _palette, i); innerArtifacts = string.concat(innerArtifacts, getCircleSVG(circle)); } string memory paths = ""; uint256 angleInterval = (360 * 10**7) / _kaleidoscope.repetitions; for (uint256 i = 0; i < _kaleidoscope.repetitions; i++) { paths = string.concat( paths, '<use href="#tile" transform="rotate(', utils.uint2floatstr(angleInterval * i, PRECISION_DEGREE), ",", utils.uint2floatstr(_kaleidoscope.centerX_precise, PRECISION_DEGREE), ",", utils.uint2floatstr(_kaleidoscope.centerY_precise, PRECISION_DEGREE), ')" />' ); } string memory clipPath = string.concat( '<clipPath id="clip">', '<path d="M0,0L', utils.uint2floatstr(_kaleidoscope.centerX_precise, PRECISION_DEGREE), ",", utils.uint2floatstr(_kaleidoscope.centerY_precise, PRECISION_DEGREE), "L", utils.uint2floatstr(_kaleidoscope.centerX_precise * 2, PRECISION_DEGREE), ",0A", utils.uint2str(RADIUS), ",", utils.uint2str(RADIUS), ',0,0,0,0,0Z" />', "</clipPath>" ); string memory svg = string.concat( '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ', utils.uint2str(SIZE), " ", utils.uint2str(SIZE), '" width="', utils.uint2str(SIZE), '" height="', utils.uint2str(SIZE), '"><defs>', linearGradient(utils.getHslString(_palette.primaryColorHsl), utils.getHslString(_palette.darkerSecondaryHsl)), clipPath, '<g id="tile" clip-path="url(#clip)">', '<rect x="0" y="-', utils.uint2str(RADIUS), '" width="', utils.uint2str(RADIUS * 2), '" height="', utils.uint2str(RADIUS * 2), '" fill="' ); svg = string.concat( svg, _kaleidoscope.hasGradient ? "url(#gradient)" : utils.getHslString(_palette.primaryColorHsl), '"></rect>', outerArtifacts, innerArtifacts, "</g>" ); svg = string.concat( svg, "</defs>", '<rect width="', utils.uint2str(SIZE), '" height="', utils.uint2str(SIZE), '" fill="', utils.getHslString(_palette.backgroundColorHsl), '"></rect>', '<g id="kaleidoscopeTile" transform="translate(', utils.uint2str(SIZE / 2 - _kaleidoscope.centerX_precise / PRECISION) // "0" ); string memory backgroundCircleBase = string.concat( '<circle cx="', utils.uint2floatstr(_kaleidoscope.centerX_precise, PRECISION_DEGREE), '" cy="', utils.uint2floatstr(_kaleidoscope.centerY_precise, PRECISION_DEGREE), '" r="' ); string memory haloTrait = string.concat( backgroundCircleBase, utils.uint2str(RADIUS + 8), '" fill="none"', _kaleidoscope.hasHalo ? ' stroke="#EBA947" stroke-width="4"' : "", "/>" ); svg = string.concat( svg, ",", utils.uint2str(SIZE / 2 - _kaleidoscope.centerY_precise / PRECISION), // "0", ')">', backgroundCircleBase, utils.uint2str(RADIUS), '" fill="', utils.getHslString(_palette.primaryColorHsl), '" />', _kaleidoscope.hasHalo ? haloTrait : "" ); svg = string.concat(svg, paths, "</g>", "</svg>"); return svg; } function render(uint256 _tokenId) public pure returns (string memory) { Kaleidoscope memory kaleidoscope = kaleidoscopeForTokenId(_tokenId); ColorPalette memory palette = colorPaletteForKaleidescope(kaleidoscope); string memory svg = getKaleidoscopeSVG(kaleidoscope, palette); return svg; } function metadata(uint256 _tokenId) public pure returns (Kaleidoscope memory) { Kaleidoscope memory kaleidoscope = kaleidoscopeForTokenId(_tokenId); return kaleidoscope; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.12; /** * @notice Solidity library offering basic trigonometry functions where inputs and outputs are * integers. Inputs are specified in radians scaled by 1e18, and similarly outputs are scaled by 1e18. * * This implementation is based off the Solidity trigonometry library written by Lefteris Karapetsas * which can be found here: https://github.com/Sikorkaio/sikorka/blob/e75c91925c914beaedf4841c0336a806f2b5f66d/contracts/trigonometry.sol * * Compared to Lefteris' implementation, this version makes the following changes: * - Uses a 32 bits instead of 16 bits for improved accuracy * - Updated for Solidity 0.8.x * - Various gas optimizations * - Change inputs/outputs to standard trig format (scaled by 1e18) instead of requiring the * integer format used by the algorithm * * Lefertis' implementation is based off Dave Dribin's trigint C library * http://www.dribin.org/dave/trigint/ * * Which in turn is based from a now deleted article which can be found in the Wayback Machine: * http://web.archive.org/web/20120301144605/http://www.dattalo.com/technical/software/pic/picsine.html */ library Trigonometry { // Table index into the trigonometric table uint256 constant INDEX_WIDTH = 8; // Interpolation between successive entries in the table uint256 constant INTERP_WIDTH = 16; uint256 constant INDEX_OFFSET = 28 - INDEX_WIDTH; uint256 constant INTERP_OFFSET = INDEX_OFFSET - INTERP_WIDTH; uint32 constant ANGLES_IN_CYCLE = 1073741824; uint32 constant QUADRANT_HIGH_MASK = 536870912; uint32 constant QUADRANT_LOW_MASK = 268435456; uint256 constant SINE_TABLE_SIZE = 256; // Pi as an 18 decimal value, which is plenty of accuracy: "For JPL's highest accuracy calculations, which are for // interplanetary navigation, we use 3.141592653589793: https://www.jpl.nasa.gov/edu/news/2016/3/16/how-many-decimals-of-pi-do-we-really-need/ uint256 constant PI = 3141592653589793238; uint256 constant TWO_PI = 2 * PI; uint256 constant PI_OVER_TWO = PI / 2; // The constant sine lookup table was generated by generate_trigonometry.py. We must use a constant // bytes array because constant arrays are not supported in Solidity. Each entry in the lookup // table is 4 bytes. Since we're using 32-bit parameters for the lookup table, we get a table size // of 2^(32/4) + 1 = 257, where the first and last entries are equivalent (hence the table size of // 256 defined above) uint8 constant entry_bytes = 4; // each entry in the lookup table is 4 bytes uint256 constant entry_mask = ((1 << (8 * entry_bytes)) - 1); // mask used to cast bytes32 -> lookup table entry bytes constant sin_table = hex"00_00_00_00_00_c9_0f_88_01_92_1d_20_02_5b_26_d7_03_24_2a_bf_03_ed_26_e6_04_b6_19_5d_05_7f_00_35_06_47_d9_7c_07_10_a3_45_07_d9_5b_9e_08_a2_00_9a_09_6a_90_49_0a_33_08_bc_0a_fb_68_05_0b_c3_ac_35_0c_8b_d3_5e_0d_53_db_92_0e_1b_c2_e4_0e_e3_87_66_0f_ab_27_2b_10_72_a0_48_11_39_f0_cf_12_01_16_d5_12_c8_10_6e_13_8e_db_b1_14_55_76_b1_15_1b_df_85_15_e2_14_44_16_a8_13_05_17_6d_d9_de_18_33_66_e8_18_f8_b8_3c_19_bd_cb_f3_1a_82_a0_25_1b_47_32_ef_1c_0b_82_6a_1c_cf_8c_b3_1d_93_4f_e5_1e_56_ca_1e_1f_19_f9_7b_1f_dc_dc_1b_20_9f_70_1c_21_61_b3_9f_22_23_a4_c5_22_e5_41_af_23_a6_88_7e_24_67_77_57_25_28_0c_5d_25_e8_45_b6_26_a8_21_85_27_67_9d_f4_28_26_b9_28_28_e5_71_4a_29_a3_c4_85_2a_61_b1_01_2b_1f_34_eb_2b_dc_4e_6f_2c_98_fb_ba_2d_55_3a_fb_2e_11_0a_62_2e_cc_68_1e_2f_87_52_62_30_41_c7_60_30_fb_c5_4d_31_b5_4a_5d_32_6e_54_c7_33_26_e2_c2_33_de_f2_87_34_96_82_4f_35_4d_90_56_36_04_1a_d9_36_ba_20_13_37_6f_9e_46_38_24_93_b0_38_d8_fe_93_39_8c_dd_32_3a_40_2d_d1_3a_f2_ee_b7_3b_a5_1e_29_3c_56_ba_70_3d_07_c1_d5_3d_b8_32_a5_3e_68_0b_2c_3f_17_49_b7_3f_c5_ec_97_40_73_f2_1d_41_21_58_9a_41_ce_1e_64_42_7a_41_d0_43_25_c1_35_43_d0_9a_ec_44_7a_cd_50_45_24_56_bc_45_cd_35_8f_46_75_68_27_47_1c_ec_e6_47_c3_c2_2e_48_69_e6_64_49_0f_57_ee_49_b4_15_33_4a_58_1c_9d_4a_fb_6c_97_4b_9e_03_8f_4c_3f_df_f3_4c_e1_00_34_4d_81_62_c3_4e_21_06_17_4e_bf_e8_a4_4f_5e_08_e2_4f_fb_65_4c_50_97_fc_5e_51_33_cc_94_51_ce_d4_6e_52_69_12_6e_53_02_85_17_53_9b_2a_ef_54_33_02_7d_54_ca_0a_4a_55_60_40_e2_55_f5_a4_d2_56_8a_34_a9_57_1d_ee_f9_57_b0_d2_55_58_42_dd_54_58_d4_0e_8c_59_64_64_97_59_f3_de_12_5a_82_79_99_5b_10_35_ce_5b_9d_11_53_5c_29_0a_cc_5c_b4_20_df_5d_3e_52_36_5d_c7_9d_7b_5e_50_01_5d_5e_d7_7c_89_5f_5e_0d_b2_5f_e3_b3_8d_60_68_6c_ce_60_ec_38_2f_61_6f_14_6b_61_f1_00_3e_62_71_fa_68_62_f2_01_ac_63_71_14_cc_63_ef_32_8f_64_6c_59_bf_64_e8_89_25_65_63_bf_91_65_dd_fb_d2_66_57_3c_bb_66_cf_81_1f_67_46_c7_d7_67_bd_0f_bc_68_32_57_aa_68_a6_9e_80_69_19_e3_1f_69_8c_24_6b_69_fd_61_4a_6a_6d_98_a3_6a_dc_c9_64_6b_4a_f2_78_6b_b8_12_d0_6c_24_29_5f_6c_8f_35_1b_6c_f9_34_fb_6d_62_27_f9_6d_ca_0d_14_6e_30_e3_49_6e_96_a9_9c_6e_fb_5f_11_6f_5f_02_b1_6f_c1_93_84_70_23_10_99_70_83_78_fe_70_e2_cb_c5_71_41_08_04_71_9e_2c_d1_71_fa_39_48_72_55_2c_84_72_af_05_a6_73_07_c3_cf_73_5f_66_25_73_b5_eb_d0_74_0b_53_fa_74_5f_9d_d0_74_b2_c8_83_75_04_d3_44_75_55_bd_4b_75_a5_85_ce_75_f4_2c_0a_76_41_af_3c_76_8e_0e_a5_76_d9_49_88_77_23_5f_2c_77_6c_4e_da_77_b4_17_df_77_fa_b9_88_78_40_33_28_78_84_84_13_78_c7_ab_a1_79_09_a9_2c_79_4a_7c_11_79_8a_23_b0_79_c8_9f_6d_7a_05_ee_ac_7a_42_10_d8_7a_7d_05_5a_7a_b6_cb_a3_7a_ef_63_23_7b_26_cb_4e_7b_5d_03_9d_7b_92_0b_88_7b_c5_e2_8f_7b_f8_88_2f_7c_29_fb_ed_7c_5a_3d_4f_7c_89_4b_dd_7c_b7_27_23_7c_e3_ce_b1_7d_0f_42_17_7d_39_80_eb_7d_62_8a_c5_7d_8a_5f_3f_7d_b0_fd_f7_7d_d6_66_8e_7d_fa_98_a7_7e_1d_93_e9_7e_3f_57_fe_7e_5f_e4_92_7e_7f_39_56_7e_9d_55_fb_7e_ba_3a_38_7e_d5_e5_c5_7e_f0_58_5f_7f_09_91_c3_7f_21_91_b3_7f_38_57_f5_7f_4d_e4_50_7f_62_36_8e_7f_75_4e_7f_7f_87_2b_f2_7f_97_ce_bc_7f_a7_36_b3_7f_b5_63_b2_7f_c2_55_95_7f_ce_0c_3d_7f_d8_87_8d_7f_e1_c7_6a_7f_e9_cb_bf_7f_f0_94_77_7f_f6_21_81_7f_fa_72_d0_7f_fd_88_59_7f_ff_62_15_7f_ff_ff_ff"; /** * @notice Return the sine of a value, specified in radians scaled by 1e18 * @dev This algorithm for converting sine only uses integer values, and it works by dividing the * circle into 30 bit angles, i.e. there are 1,073,741,824 (2^30) angle units, instead of the * standard 360 degrees (2pi radians). From there, we get an output in range -2,147,483,647 to * 2,147,483,647, (which is the max value of an int32) which is then converted back to the standard * range of -1 to 1, again scaled by 1e18 * @param _angle Angle to convert * @return Result scaled by 1e18 */ function sin(uint256 _angle) internal pure returns (int256) { unchecked { // Convert angle from from arbitrary radian value (range of 0 to 2pi) to the algorithm's range // of 0 to 1,073,741,824 _angle = (ANGLES_IN_CYCLE * (_angle % TWO_PI)) / TWO_PI; // Apply a mask on an integer to extract a certain number of bits, where angle is the integer // whose bits we want to get, the width is the width of the bits (in bits) we want to extract, // and the offset is the offset of the bits (in bits) we want to extract. The result is an // integer containing _width bits of _value starting at the offset bit uint256 interp = (_angle >> INTERP_OFFSET) & ((1 << INTERP_WIDTH) - 1); uint256 index = (_angle >> INDEX_OFFSET) & ((1 << INDEX_WIDTH) - 1); // The lookup table only contains data for one quadrant (since sin is symmetric around both // axes), so here we figure out which quadrant we're in, then we lookup the values in the // table then modify values accordingly bool is_odd_quadrant = (_angle & QUADRANT_LOW_MASK) == 0; bool is_negative_quadrant = (_angle & QUADRANT_HIGH_MASK) != 0; if (!is_odd_quadrant) { index = SINE_TABLE_SIZE - 1 - index; } bytes memory table = sin_table; // We are looking for two consecutive indices in our lookup table // Since EVM is left aligned, to read n bytes of data from idx i, we must read from `i * data_len` + `n` // therefore, to read two entries of size entry_bytes `index * entry_bytes` + `entry_bytes * 2` uint256 offset1_2 = (index + 2) * entry_bytes; // This following snippet will function for any entry_bytes <= 15 uint256 x1_2; assembly { // mload will grab one word worth of bytes (32), as that is the minimum size in EVM x1_2 := mload(add(table, offset1_2)) } // We now read the last two numbers of size entry_bytes from x1_2 // in example: entry_bytes = 4; x1_2 = 0x00...12345678abcdefgh // therefore: entry_mask = 0xFFFFFFFF // 0x00...12345678abcdefgh >> 8*4 = 0x00...12345678 // 0x00...12345678 & 0xFFFFFFFF = 0x12345678 uint256 x1 = (x1_2 >> (8 * entry_bytes)) & entry_mask; // 0x00...12345678abcdefgh & 0xFFFFFFFF = 0xabcdefgh uint256 x2 = x1_2 & entry_mask; // Approximate angle by interpolating in the table, accounting for the quadrant uint256 approximation = ((x2 - x1) * interp) >> INTERP_WIDTH; int256 sine = is_odd_quadrant ? int256(x1) + int256(approximation) : int256(x2) - int256(approximation); if (is_negative_quadrant) { sine *= -1; } // Bring result from the range of -2,147,483,647 through 2,147,483,647 to -1e18 through 1e18. // This can never overflow because sine is bounded by the above values return (sine * 1e18) / 2_147_483_647; } } /** * @notice Return the cosine of a value, specified in radians scaled by 1e18 * @dev This is identical to the sin() method, and just computes the value by delegating to the * sin() method using the identity cos(x) = sin(x + pi/2) * @dev Overflow when `angle + PI_OVER_TWO > type(uint256).max` is ok, results are still accurate * @param _angle Angle to convert * @return Result scaled by 1e18 */ function cos(uint256 _angle) internal pure returns (int256) { unchecked { return sin(_angle + PI_OVER_TWO); } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.12; // Core utils used extensively to format CSS and numbers. library utils { struct HSL { uint256 h; uint256 s; uint256 l; } function random(string memory input) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(input))); } function randomRange( uint256 tokenId, string memory keyPrefix, uint256 lower, uint256 upper ) internal pure returns (uint256) { uint256 rand = random(string(abi.encodePacked(keyPrefix, uint2str(tokenId)))); return (rand % (upper - lower + 1)) + lower; } function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } function generateColors(uint256 _hue, uint256 _numColors) public pure returns (HSL[] memory) { HSL[] memory colors = new HSL[](_numColors); for (uint256 i = 0; i < _numColors; i++) { colors[i] = HSL(_hue, 100 - ((i * 50) / _numColors), 70 - ((i * 30) / _numColors)); } return colors; } function getHueName(uint256 _hue) public pure returns (string memory) { _hue = _hue % 360; string[12] memory colors = [ "Red", "Orange", "Yellow", "Chartreuse", "Green", "Spring green", "Turquoise", "Teal", "Blue", "Violet", "Magenta", "Rose" ]; uint256 colorIndex = (_hue / 30) % colors.length; return colors[colorIndex]; } function getHslString(HSL memory _hsl) public pure returns (string memory) { return string(abi.encodePacked("hsl(", uint2str(_hsl.h), ",", uint2str(_hsl.s), "%,", uint2str(_hsl.l), "%)")); } function uint2floatstr(uint256 _i_scaled, uint256 _decimals) internal pure returns (string memory) { return string.concat(uint2str(_i_scaled / (10**_decimals)), ".", uint2str(_i_scaled % (10**_decimals))); } function int2str(int256 _i) internal pure returns (string memory _uintAsString) { if (_i < 0) { return string.concat("-", uint2str(uint256(-_i))); } else { return uint2str(uint256(_i)); } } // converts an unsigned integer to a string function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": { "contracts/Utilities.sol": { "utils": "0x01e833cf8c115bb859a8e16a72d5ff298f834413" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"_kaleidoscope","type":"tuple"},{"components":[{"internalType":"uint256","name":"primaryHue","type":"uint256"},{"internalType":"uint256","name":"secondaryHue","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"primaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"secondaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"backgroundColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"darkerSecondaryHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"primaryColorsHsl","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"secondaryColorsHsl","type":"tuple[]"}],"internalType":"struct Renderer.ColorPalette","name":"_palette","type":"tuple"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"circleAtIndexForKaleidescope","outputs":[{"components":[{"internalType":"int256","name":"x1","type":"int256"},{"internalType":"int256","name":"y1","type":"int256"},{"internalType":"int256","name":"x2","type":"int256"},{"internalType":"int256","name":"y2","type":"int256"},{"internalType":"uint256","name":"radius1","type":"uint256"},{"internalType":"uint256","name":"radius2","type":"uint256"},{"internalType":"uint256","name":"alternatingClass","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"color","type":"tuple"}],"internalType":"struct Renderer.AnimatedCircle","name":"circle","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"_kaleidoscope","type":"tuple"}],"name":"colorPaletteForKaleidescope","outputs":[{"components":[{"internalType":"uint256","name":"primaryHue","type":"uint256"},{"internalType":"uint256","name":"secondaryHue","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"primaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"secondaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"backgroundColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"darkerSecondaryHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"primaryColorsHsl","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"secondaryColorsHsl","type":"tuple[]"}],"internalType":"struct Renderer.ColorPalette","name":"palette","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"int256","name":"x1","type":"int256"},{"internalType":"int256","name":"y1","type":"int256"},{"internalType":"int256","name":"x2","type":"int256"},{"internalType":"int256","name":"y2","type":"int256"},{"internalType":"uint256","name":"radius1","type":"uint256"},{"internalType":"uint256","name":"radius2","type":"uint256"},{"internalType":"uint256","name":"alternatingClass","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"color","type":"tuple"}],"internalType":"struct Renderer.AnimatedCircle","name":"_circle","type":"tuple"}],"name":"getCircleSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"_kaleidoscope","type":"tuple"},{"components":[{"internalType":"uint256","name":"primaryHue","type":"uint256"},{"internalType":"uint256","name":"secondaryHue","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"primaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"secondaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"backgroundColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"darkerSecondaryHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"primaryColorsHsl","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"secondaryColorsHsl","type":"tuple[]"}],"internalType":"struct Renderer.ColorPalette","name":"_palette","type":"tuple"}],"name":"getKaleidoscopeSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"width","type":"uint256"},{"internalType":"uint256","name":"height","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"color","type":"tuple"}],"internalType":"struct Renderer.AnimatedRectangle","name":"_rectangle","type":"tuple"}],"name":"getRectangleSVG","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"kaleidoscopeForTokenId","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"kaleidoscope","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"metadata","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"repetitions","type":"uint256"},{"internalType":"uint256","name":"numInsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"numOutsideArtifacts","type":"uint256"},{"internalType":"uint256","name":"centerX_precise","type":"uint256"},{"internalType":"uint256","name":"centerY_precise","type":"uint256"},{"internalType":"bool","name":"hasGradient","type":"bool"},{"internalType":"bool","name":"hasSecondaryColor","type":"bool"},{"internalType":"bool","name":"hasHalo","type":"bool"}],"internalType":"struct Renderer.Kaleidoscope","name":"_kaleidoscope","type":"tuple"},{"components":[{"internalType":"uint256","name":"primaryHue","type":"uint256"},{"internalType":"uint256","name":"secondaryHue","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"primaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"secondaryColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"backgroundColorHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"darkerSecondaryHsl","type":"tuple"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"primaryColorsHsl","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL[]","name":"secondaryColorsHsl","type":"tuple[]"}],"internalType":"struct Renderer.ColorPalette","name":"_palette","type":"tuple"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"rectangleAtIndexForKaleidescope","outputs":[{"components":[{"internalType":"uint256","name":"width","type":"uint256"},{"internalType":"uint256","name":"height","type":"uint256"},{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"components":[{"internalType":"uint256","name":"h","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"l","type":"uint256"}],"internalType":"struct utils.HSL","name":"color","type":"tuple"}],"internalType":"struct Renderer.AnimatedRectangle","name":"rectangle","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"render","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50614e50806100206000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063aa9e7e7511610066578063aa9e7e7514610158578063b3c34a5014610188578063c321118c146101b8578063d6cf5f55146101e8578063e3684e391461021857610093565b80631ac48ab1146100985780637d11e69c146100c85780638a0e9ad7146100f857806391b078a414610128575b600080fd5b6100b260048036038101906100ad919061212f565b610248565b6040516100bf91906121dc565b60405180910390f35b6100e260048036038101906100dd91906124e9565b6104cc565b6040516100ef91906121dc565b60405180910390f35b610112600480360381019061010d9190612547565b610c4e565b60405161011f9190612686565b60405180910390f35b610142600480360381019061013d91906126a2565b610e3a565b60405161014f919061283a565b60405180910390f35b610172600480360381019061016d91906128fd565b6110c6565b60405161017f91906121dc565b60405180910390f35b6101a2600480360381019061019d9190612547565b6111e8565b6040516101af91906129f1565b60405180910390f35b6101d260048036038101906101cd9190612a0d565b6115bc565b6040516101df91906121dc565b60405180910390f35b61020260048036038101906101fd9190612a0d565b6115f1565b60405161020f9190612b00565b60405180910390f35b610232600480360381019061022d9190612a0d565b611868565b60405161023f9190612b00565b60405180910390f35b606060006102598360800151611886565b6102668460a00151611886565b6102738560800151611886565b6102808660a00151611886565b61029960028860e001516102949190612b4b565b611886565b6040516020016102ad959493929190612cc5565b6040516020818303038152906040529050806102cc8460200151611a0e565b6102d98560600151611a0e565b6102e68660200151611a0e565b6102f38760600151611a0e565b61030c60028960e001516103079190612b4b565b611886565b60405160200161032196959493929190612dd8565b6040516020818303038152906040529050806103408460000151611a0e565b61034d8560400151611a0e565b61035a8660000151611a0e565b6103678760400151611a0e565b61038060028960e0015161037b9190612b4b565b611886565b60405160200161039596959493929190612ef8565b60405160208183030381529060405290506103ce6002846040015185600001516103bf9190612fa6565b6103c99190613019565b611a0e565b6103f66002856060015186602001516103e79190612fa6565b6103f19190613019565b611a0e565b61041e60028660a00151876080015161040f9190613083565b61041991906130b7565b611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588761010001516040518263ffffffff1660e01b815260040161045a9190613139565b600060405180830381865af4158015610477573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104a091906131fa565b846040516020016104b5959493929190613327565b604051602081830303815290604052915050919050565b6060600060405180602001604052806000815250905060005b84606001518110156105405760006104fe868684610c4e565b90508261050a826110c6565b60405160200161051b9291906133cc565b6040516020818303038152906040529250508080610538906133f0565b9150506104e5565b50600060405180602001604052806000815250905060005b85604001518110156105b35760006105718787846111e8565b90508261057d82610248565b60405160200161058e9291906133cc565b60405160208183030381529060405292505080806105ab906133f0565b915050610558565b5060006040518060200160405280600081525090506000866020015163d693a4006105de91906130b7565b905060005b876020015181101561065b578261060682846105ff9190612b4b565b6007611a62565b6106158a608001516007611a62565b6106248b60a001516007611a62565b60405160200161063794939291906134f6565b60405160208183030381529060405292508080610653906133f0565b9150506105e3565b50600061066d88608001516007611a62565b61067c8960a001516007611a62565b61069760028b608001516106909190612b4b565b6007611a62565b6106a160c8611886565b6106ab60c8611886565b6040516020016106bf959493929190613650565b604051602081830303815290604052905060006106dd6101f4611886565b6106e86101f4611886565b6106f36101f4611886565b6106fe6101f4611886565b6108087301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588e604001516040518263ffffffff1660e01b815260040161073c9190613139565b600060405180830381865af4158015610759573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061078291906131fa565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588f60a001516040518263ffffffff1660e01b81526004016107bd9190613139565b600060405180830381865af41580156107da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061080391906131fa565b611acc565b8661081360c8611886565b610829600260c86108249190612b4b565b611886565b61083f600260c861083a9190612b4b565b611886565b604051602001610857999897969594939291906138b5565b6040516020818303038152906040529050808960c001516108f8577301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588a604001516040518263ffffffff1660e01b81526004016108ad9190613139565b600060405180830381865af41580156108ca573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108f391906131fa565b61092f565b6040518060400160405280600e81526020017f75726c28236772616469656e74290000000000000000000000000000000000008152505b87876040516020016109449493929190613a0e565b6040516020818303038152906040529050806109616101f4611886565b61096c6101f4611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588c608001516040518263ffffffff1660e01b81526004016109a79190613139565b600060405180830381865af41580156109c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109ed91906131fa565b610a2b6007600a6109fe9190613b9d565b8e60800151610a0d91906130b7565b60026101f4610a1c91906130b7565b610a269190613be8565b611886565b604051602001610a3f959493929190613cda565b60405160208183030381529060405290506000610a618a608001516007611a62565b610a708b60a001516007611a62565b604051602001610a81929190613d7b565b6040516020818303038152906040529050600081610aab600860c8610aa69190613083565b611886565b8c6101000151610aca5760405180602001604052806000815250610ae4565b604051806060016040528060228152602001614df9602291395b604051602001610af693929190613e18565b604051602081830303815290604052905082610b466007600a610b199190613b9d565b8d60a00151610b2891906130b7565b60026101f4610b3791906130b7565b610b419190613be8565b611886565b83610b5160c8611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588f604001516040518263ffffffff1660e01b8152600401610b8c9190613139565b600060405180830381865af4158015610ba9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bd291906131fa565b8f6101000151610bf15760405180602001604052806000815250610bf3565b855b604051602001610c0896959493929190613eb3565b60405160208183030381529060405292508286604051602001610c2c929190613f6d565b6040516020818303038152906040529250829850505050505050505092915050565b610c56611d77565b610cd18460000151610c6784611886565b604051602001610c779190613fd5565b60405160208183030381529060405260026007600a610c969190613b9d565b8860a00151610ca591906130b7565b610caf91906130b7565b6007600a610cbd9190613b9d565b8860a00151610ccc91906130b7565b611af8565b816000018181525050610d558460000151610ceb84611886565b604051602001610cfb9190614021565b6040516020818303038152906040526007600a610d189190613b9d565b8760a00151610d2791906130b7565b600860c8610d3591906130b7565b60028960a00151610d469190612b4b565b610d509190613083565b611af8565b81602001818152505060008160400181815250506007600a610d779190613b9d565b8460a00151610d8691906130b7565b816060018181525050610dc88460000151610da084611886565b604051602001610db0919061406d565b6040516020818303038152906040526005600a611af8565b8160800181815250506000600283610de09190614093565b14610e0a578260e00151600081518110610dfd57610dfc6140c4565b5b6020026020010151610e2b565b8260c00151600081518110610e2257610e216140c4565b5b60200260200101515b8160a001819052509392505050565b610e42611db3565b610e8a82600001516040518060400160405280600a81526020017f7072696d617279487565000000000000000000000000000000000000000000008152506000610168611af8565b8160000181815250508160e00151610ea6578060000151610ec5565b61016860f08260000151610eba9190613083565b610ec49190614093565b5b81602001818152505060405180606001604052808260000151815260200160648152602001601e8152508160400181905250604051806060016040528082602001518152602001606481526020016046815250816060018190525060405180606001604052808260000151815260200160648152602001600a81525081608001819052506040518060600160405280610168600a8460000151610f689190613083565b610f729190614093565b815260200160648152602001600a8152508160a001819052507301e833cf8c115bb859a8e16a72d5ff298f834413635c1b88f9826000015160018560400151610fbb9190613083565b6040518363ffffffff1660e01b8152600401610fd8929190614102565b600060405180830381865af4158015610ff5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101e919061423b565b8160c001819052507301e833cf8c115bb859a8e16a72d5ff298f834413635c1b88f98260200151600185604001516110569190613083565b6040518363ffffffff1660e01b8152600401611073929190614102565b600060405180830381865af4158015611090573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110b9919061423b565b8160e00181905250919050565b606060006110d78360600151611886565b6110e48460600151611886565b6110f18560800151611886565b6040516020016111039392919061438e565b60405160208183030381529060405290506111218360600151611886565b61112e8460000151611886565b61113b8560200151611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588760a001516040518263ffffffff1660e01b81526004016111769190613139565b600060405180830381865af4158015611193573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111bc91906131fa565b846040516020016111d1959493929190614443565b604051602081830303815290604052915050919050565b6111f0611e10565b6000600860c861120091906130b7565b6007600a61120e9190613b9d565b8660a0015161121d91906130b7565b6112279190613083565b9050611261856000015161123a85611886565b60405160200161124a919061450e565b604051602081830303815290604052601484611af8565b8260200181815250506112a2856000015161127b85611886565b60405160200161128b919061455a565b604051602081830303815290604052601484611af8565b8260600181815250506112e485600001516112bc85611886565b6040516020016112cc91906145a6565b60405160208183030381529060405260006003611af8565b8260c0018181525050816060015182602001511380156113145750600060028360c001516113129190614093565b145b1561133c57600082602001519050826060015183602001818152505080836060018181525050505b600085608001516103e88760a001516113559190612b4b565b61135f91906130b7565b9050600060026007600a6113739190613b9d565b886080015161138291906130b7565b61138c9190612b4b565b90506113d96103e8846103e887602001516113a79190612b4b565b6113b191906130b7565b6103e86113be9190613be8565b836113c99190612b4b565b6113d391906130b7565b82611b68565b84608001818152505061142d6103e8846103e887606001516113fb9190612b4b565b61140591906130b7565b6103e86114129190613be8565b8361141d9190612b4b565b61142791906130b7565b82611b68565b8460a00181815250506000826103e8866020015161144b91906145cc565b6114559190613019565b90506002856080015161146891906145cc565b8161147391906146e3565b8560000181815250506000836103e8876060015161149191906145cc565b61149b9190613019565b905060028660a001516114ae91906145cc565b816007600a6114bd9190613b9d565b8b608001516114cc91906130b7565b60026114d891906145cc565b6114e291906146e3565b6114ec9190612fa6565b86604001818152505061152e896000015161150689611886565b604051602001611516919061474c565b60405160208183030381529060405260036007611af8565b8660e001818152505060006002886115469190614093565b1461157b578760e0015160018861155d9190613083565b8151811061156e5761156d6140c4565b5b60200260200101516115a7565b8760c0015160018861158d9190613083565b8151811061159e5761159d6140c4565b5b60200260200101515b86610100018190525050505050509392505050565b606060006115c9836115f1565b905060006115d682610e3a565b905060006115e483836104cc565b9050809350505050919050565b6115f9611e62565b81816000018181525050611646826040518060400160405280600b81526020017f72657065746974696f6e7300000000000000000000000000000000000000000081525060036014611af8565b816020018181525050611692826040518060400160405280601281526020017f6e756d496e7369646541727469666163747300000000000000000000000000008152506003600a611af8565b8160400181815250506116de826040518060400160405280601381526020017f6e756d4f7574736964654172746966616374730000000000000000000000000081525060016004611af8565b816060018181525050600561172c836040518060400160405280600b81526020017f6861734772616469656e740000000000000000000000000000000000000000008152506001600a611af8565b148160c00190151590811515815250506008611781836040518060400160405280600e81526020017f7365636f6e64617279436f6c6f7200000000000000000000000000000000000081525060016008611af8565b148160e0019015159081151581525050600060b4672b992ddfa23249d6600284602001516101686117b291906130b7565b60b46117be9190613be8565b6117c891906130b7565b6117d29190612b4b565b6117dc91906130b7565b9050600760126117ec9190613be8565b600a6117f89190613b9d565b61180182611b81565b60c861180d91906145cc565b6118179190613019565b8260800181815250506007601261182e9190613be8565b600a61183a9190613b9d565b61184382611bae565b60c861184f91906145cc565b6118599190613019565b8260a001818152505050919050565b611870611e62565b600061187b836115f1565b905080915050919050565b6060600082036118cd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a09565b600082905060005b600082146118ff5780806118e8906133f0565b915050600a826118f891906130b7565b91506118d5565b60008167ffffffffffffffff81111561191b5761191a611eff565b5b6040519080825280601f01601f19166020018201604052801561194d5781602001600182028036833780820191505090505b50905060008290505b60008614611a015760018161196b9190613be8565b90506000600a808861197d91906130b7565b6119879190612b4b565b876119929190613be8565b603061199e919061477f565b905060008160f81b9050808484815181106119bc576119bb6140c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886119f891906130b7565b97505050611956565b819450505050505b919050565b60606000821215611a5157611a2b82611a26906147b4565b611886565b604051602001611a3b9190614822565b6040516020818303038152906040529050611a5d565b611a5a82611886565b90505b919050565b6060611a8482600a611a749190613b9d565b84611a7f91906130b7565b611886565b611aa483600a611a949190613b9d565b85611a9f9190614093565b611886565b604051602001611ab592919061486e565b604051602081830303815290604052905092915050565b60608282604051602001611ae192919061495f565b604051602081830303815290604052905092915050565b600080611b2d85611b0888611886565b604051602001611b199291906133cc565b604051602081830303815290604052611d44565b90508360018585611b3e9190613be8565b611b489190613083565b82611b539190614093565b611b5d9190613083565b915050949350505050565b6000818310611b775781611b79565b825b905092915050565b6000611ba76002672b992ddfa23249d681611b9f57611b9e612fea565b5b048301611bae565b9050919050565b6000672b992ddfa23249d6600202672b992ddfa23249d66002028381611bd757611bd6612fea565b5b06634000000063ffffffff160281611bf257611bf1612fea565b5b0491506000600160106001901b0360106008601c030384901c1690506000600160086001901b036008601c0385901c169050600080631000000063ffffffff168616149050600080632000000063ffffffff1687161415905081611c5b57826001610100030392505b600060405180610440016040528061040481526020016149f5610404913990506000600460ff1660028601029050600081830151905060006001600460080260ff166001901b03600460080260ff1683901c16905060006001600460080260ff166001901b0383169050600060108a84840302901c9050600088611ce157818303611ce5565b8184015b90508715611d13577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810290505b637fffffff670de0b6b3a7640000820281611d3157611d30612fea565b5b059b505050505050505050505050919050565b600081604051602001611d5791906149dd565b6040516020818303038152906040528051906020012060001c9050919050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001611dad611eb4565b81525090565b6040518061010001604052806000815260200160008152602001611dd5611eb4565b8152602001611de2611eb4565b8152602001611def611eb4565b8152602001611dfc611eb4565b815260200160608152602001606081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001611e5c611eb4565b81525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581526020016000151581525090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611f3782611eee565b810181811067ffffffffffffffff82111715611f5657611f55611eff565b5b80604052505050565b6000611f69611ed5565b9050611f758282611f2e565b919050565b600080fd5b6000819050919050565b611f9281611f7f565b8114611f9d57600080fd5b50565b600081359050611faf81611f89565b92915050565b6000819050919050565b611fc881611fb5565b8114611fd357600080fd5b50565b600081359050611fe581611fbf565b92915050565b60006060828403121561200157612000611ee9565b5b61200b6060611f5f565b9050600061201b84828501611fd6565b600083015250602061202f84828501611fd6565b602083015250604061204384828501611fd6565b60408301525092915050565b6000610160828403121561206657612065611ee9565b5b612071610120611f5f565b9050600061208184828501611fa0565b600083015250602061209584828501611fa0565b60208301525060406120a984828501611fa0565b60408301525060606120bd84828501611fa0565b60608301525060806120d184828501611fd6565b60808301525060a06120e584828501611fd6565b60a08301525060c06120f984828501611fd6565b60c08301525060e061210d84828501611fd6565b60e08301525061010061212284828501611feb565b6101008301525092915050565b6000610160828403121561214657612145611edf565b5b60006121548482850161204f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561219757808201518184015260208101905061217c565b60008484015250505050565b60006121ae8261215d565b6121b88185612168565b93506121c8818560208601612179565b6121d181611eee565b840191505092915050565b600060208201905081810360008301526121f681846121a3565b905092915050565b60008115159050919050565b612213816121fe565b811461221e57600080fd5b50565b6000813590506122308161220a565b92915050565b6000610120828403121561224d5761224c611ee9565b5b612258610120611f5f565b9050600061226884828501611fd6565b600083015250602061227c84828501611fd6565b602083015250604061229084828501611fd6565b60408301525060606122a484828501611fd6565b60608301525060806122b884828501611fd6565b60808301525060a06122cc84828501611fd6565b60a08301525060c06122e084828501612221565b60c08301525060e06122f484828501612221565b60e08301525061010061230984828501612221565b6101008301525092915050565b600080fd5b600067ffffffffffffffff82111561233657612335611eff565b5b602082029050602081019050919050565b600080fd5b600061235f61235a8461231b565b611f5f565b9050808382526020820190506060840283018581111561238257612381612347565b5b835b818110156123ab57806123978882611feb565b845260208401935050606081019050612384565b5050509392505050565b600082601f8301126123ca576123c9612316565b5b81356123da84826020860161234c565b91505092915050565b600061020082840312156123fa576123f9611ee9565b5b612405610100611f5f565b9050600061241584828501611fd6565b600083015250602061242984828501611fd6565b602083015250604061243d84828501611feb565b60408301525060a061245184828501611feb565b60608301525061010061246684828501611feb565b60808301525061016061247b84828501611feb565b60a0830152506101c082013567ffffffffffffffff8111156124a05761249f611f7a565b5b6124ac848285016123b5565b60c0830152506101e082013567ffffffffffffffff8111156124d1576124d0611f7a565b5b6124dd848285016123b5565b60e08301525092915050565b600080610140838503121561250157612500611edf565b5b600061250f85828601612236565b92505061012083013567ffffffffffffffff81111561253157612530611ee4565b5b61253d858286016123e3565b9150509250929050565b6000806000610160848603121561256157612560611edf565b5b600061256f86828701612236565b93505061012084013567ffffffffffffffff81111561259157612590611ee4565b5b61259d868287016123e3565b9250506101406125af86828701611fd6565b9150509250925092565b6125c281611fb5565b82525050565b6060820160008201516125de60008501826125b9565b5060208201516125f160208501826125b9565b50604082015161260460408501826125b9565b50505050565b6101008201600082015161262160008501826125b9565b50602082015161263460208501826125b9565b50604082015161264760408501826125b9565b50606082015161265a60608501826125b9565b50608082015161266d60808501826125b9565b5060a082015161268060a08501826125c8565b50505050565b60006101008201905061269c600083018461260a565b92915050565b600061012082840312156126b9576126b8611edf565b5b60006126c784828501612236565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061270883836125c8565b60608301905092915050565b6000602082019050919050565b600061272c826126d0565b61273681856126db565b9350612741836126ec565b8060005b8381101561277257815161275988826126fc565b975061276483612714565b925050600181019050612745565b5085935050505092915050565b60006102008301600083015161279860008601826125b9565b5060208301516127ab60208601826125b9565b5060408301516127be60408601826125c8565b5060608301516127d160a08601826125c8565b5060808301516127e56101008601826125c8565b5060a08301516127f96101608601826125c8565b5060c08301518482036101c08601526128128282612721565b91505060e08301518482036101e086015261282d8282612721565b9150508091505092915050565b60006020820190508181036000830152612854818461277f565b905092915050565b6000610100828403121561287357612872611ee9565b5b61287d60c0611f5f565b9050600061288d84828501611fd6565b60008301525060206128a184828501611fd6565b60208301525060406128b584828501611fd6565b60408301525060606128c984828501611fd6565b60608301525060806128dd84828501611fd6565b60808301525060a06128f184828501611feb565b60a08301525092915050565b6000610100828403121561291457612913611edf565b5b60006129228482850161285c565b91505092915050565b61293481611f7f565b82525050565b61016082016000820151612951600085018261292b565b506020820151612964602085018261292b565b506040820151612977604085018261292b565b50606082015161298a606085018261292b565b50608082015161299d60808501826125b9565b5060a08201516129b060a08501826125b9565b5060c08201516129c360c08501826125b9565b5060e08201516129d660e08501826125b9565b506101008201516129eb6101008501826125c8565b50505050565b600061016082019050612a07600083018461293a565b92915050565b600060208284031215612a2357612a22611edf565b5b6000612a3184828501611fd6565b91505092915050565b612a43816121fe565b82525050565b61012082016000820151612a6060008501826125b9565b506020820151612a7360208501826125b9565b506040820151612a8660408501826125b9565b506060820151612a9960608501826125b9565b506080820151612aac60808501826125b9565b5060a0820151612abf60a08501826125b9565b5060c0820151612ad260c0850182612a3a565b5060e0820151612ae560e0850182612a3a565b50610100820151612afa610100850182612a3a565b50505050565b600061012082019050612b166000830184612a49565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b5682611fb5565b9150612b6183611fb5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b9a57612b99612b1c565b5b828202905092915050565b600081905092915050565b7f3c616e696d617465206174747269627574654e616d653d2272222076616c756560008201527f733d220000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0c602383612ba5565b9150612c1782612bb0565b602382019050919050565b6000612c2d8261215d565b612c378185612ba5565b9350612c47818560208601612179565b80840191505092915050565b7f3b00000000000000000000000000000000000000000000000000000000000000815250565b7f222063616c634d6f64653d226c696e65617222206475723d2200000000000000815250565b7f732220726570656174436f756e743d22696e646566696e697465222f3e000000815250565b6000612cd082612bff565b9150612cdc8288612c22565b9150612ce782612c53565b600182019150612cf78287612c22565b9150612d0282612c53565b600182019150612d128286612c22565b9150612d1d82612c53565b600182019150612d2d8285612c22565b9150612d3882612c79565b601982019150612d488284612c22565b9150612d5382612c9f565b601d820191508190509695505050505050565b7f3c616e696d617465206174747269627574654e616d653d226379222076616c7560008201527f65733d2200000000000000000000000000000000000000000000000000000000602082015250565b6000612dc2602483612ba5565b9150612dcd82612d66565b602482019050919050565b6000612de48289612c22565b9150612def82612db5565b9150612dfb8288612c22565b9150612e0682612c53565b600182019150612e168287612c22565b9150612e2182612c53565b600182019150612e318286612c22565b9150612e3c82612c53565b600182019150612e4c8285612c22565b9150612e5782612c79565b601982019150612e678284612c22565b9150612e7282612c9f565b601d82019150819050979650505050505050565b7f3c616e696d617465206174747269627574654e616d653d226378222076616c7560008201527f65733d2200000000000000000000000000000000000000000000000000000000602082015250565b6000612ee2602483612ba5565b9150612eed82612e86565b602482019050919050565b6000612f048289612c22565b9150612f0f82612ed5565b9150612f1b8288612c22565b9150612f2682612c53565b600182019150612f368287612c22565b9150612f4182612c53565b600182019150612f518286612c22565b9150612f5c82612c53565b600182019150612f6c8285612c22565b9150612f7782612c79565b601982019150612f878284612c22565b9150612f9282612c9f565b601d82019150819050979650505050505050565b6000612fb182611f7f565b9150612fbc83611f7f565b925082820190508281121560008312168382126000841215161715612fe457612fe3612b1c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061302482611f7f565b915061302f83611f7f565b92508261303f5761303e612fea565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161561307857613077612b1c565b5b828205905092915050565b600061308e82611fb5565b915061309983611fb5565b92508282019050808211156130b1576130b0612b1c565b5b92915050565b60006130c282611fb5565b91506130cd83611fb5565b9250826130dd576130dc612fea565b5b828204905092915050565b6130f181611fb5565b82525050565b60608201600082015161310d60008501826130e8565b50602082015161312060208501826130e8565b50604082015161313360408501826130e8565b50505050565b600060608201905061314e60008301846130f7565b92915050565b600080fd5b600067ffffffffffffffff82111561317457613173611eff565b5b61317d82611eee565b9050602081019050919050565b600061319d61319884613159565b611f5f565b9050828152602081018484840111156131b9576131b8613154565b5b6131c4848285612179565b509392505050565b600082601f8301126131e1576131e0612316565b5b81516131f184826020860161318a565b91505092915050565b6000602082840312156132105761320f611edf565b5b600082015167ffffffffffffffff81111561322e5761322d611ee4565b5b61323a848285016131cc565b91505092915050565b7f3c636972636c652063783d220000000000000000000000000000000000000000815250565b7f222063793d220000000000000000000000000000000000000000000000000000815250565b7f2220723d22000000000000000000000000000000000000000000000000000000815250565b7f222066696c6c3d22000000000000000000000000000000000000000000000000815250565b7f223e000000000000000000000000000000000000000000000000000000000000815250565b7f3c2f636972636c653e0000000000000000000000000000000000000000000000815250565b600061333282613243565b600c820191506133428288612c22565b915061334d82613269565b60068201915061335d8287612c22565b91506133688261328f565b6005820191506133788286612c22565b9150613383826132b5565b6008820191506133938285612c22565b915061339e826132db565b6002820191506133ae8284612c22565b91506133b982613301565b6009820191508190509695505050505050565b60006133d88285612c22565b91506133e48284612c22565b91508190509392505050565b60006133fb82611fb5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361342d5761342c612b1c565b5b600182019050919050565b7f3c75736520687265663d222374696c6522207472616e73666f726d3d22726f7460008201527f6174652800000000000000000000000000000000000000000000000000000000602082015250565b6000613494602483612ba5565b915061349f82613438565b602482019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b7f2922202f3e000000000000000000000000000000000000000000000000000000815250565b60006135028287612c22565b915061350d82613487565b91506135198286612c22565b9150613524826134aa565b6001820191506135348285612c22565b915061353f826134aa565b60018201915061354f8284612c22565b915061355a826134d0565b60058201915081905095945050505050565b7f3c636c6970506174682069643d22636c6970223e000000000000000000000000815250565b7f3c7061746820643d224d302c304c000000000000000000000000000000000000815250565b7f4c00000000000000000000000000000000000000000000000000000000000000815250565b7f2c30410000000000000000000000000000000000000000000000000000000000815250565b7f2c302c302c302c302c305a22202f3e0000000000000000000000000000000000815250565b7f3c2f636c6970506174683e000000000000000000000000000000000000000000815250565b600061365b8261356c565b60148201915061366a82613592565b600e8201915061367a8288612c22565b9150613685826134aa565b6001820191506136958287612c22565b91506136a0826135b8565b6001820191506136b08286612c22565b91506136bb826135de565b6003820191506136cb8285612c22565b91506136d6826134aa565b6001820191506136e68284612c22565b91506136f182613604565b600f820191506137008261362a565b600b820191508190509695505050505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060008201527f30302f737667222076696577426f783d22302030200000000000000000000000602082015250565b600061376f603583612ba5565b915061377a82613713565b603582019050919050565b7f2000000000000000000000000000000000000000000000000000000000000000815250565b7f222077696474683d220000000000000000000000000000000000000000000000815250565b7f22206865696768743d2200000000000000000000000000000000000000000000815250565b7f223e3c646566733e000000000000000000000000000000000000000000000000815250565b7f3c672069643d2274696c652220636c69702d706174683d2275726c2823636c6960008201527f7029223e00000000000000000000000000000000000000000000000000000000602082015250565b6000613879602483612ba5565b91506138848261381d565b602482019050919050565b7f3c7265637420783d22302220793d222d00000000000000000000000000000000815250565b60006138c082613762565b91506138cc828c612c22565b91506138d782613785565b6001820191506138e7828b612c22565b91506138f2826137ab565b600982019150613902828a612c22565b915061390d826137d1565b600a8201915061391d8289612c22565b9150613928826137f7565b6008820191506139388288612c22565b91506139448287612c22565b915061394f8261386c565b915061395a8261388f565b60108201915061396a8286612c22565b9150613975826137ab565b6009820191506139858285612c22565b9150613990826137d1565b600a820191506139a08284612c22565b91506139ab826132b5565b6008820191508190509a9950505050505050505050565b7f223e3c2f726563743e0000000000000000000000000000000000000000000000815250565b7f3c2f673e00000000000000000000000000000000000000000000000000000000815250565b6000613a1a8287612c22565b9150613a268286612c22565b9150613a31826139c2565b600982019150613a418285612c22565b9150613a4d8284612c22565b9150613a58826139e8565b60048201915081905095945050505050565b60008160011c9050919050565b6000808291508390505b6001851115613ac157808604811115613a9d57613a9c612b1c565b5b6001851615613aac5780820291505b8081029050613aba85613a6a565b9450613a81565b94509492505050565b600082613ada5760019050613b96565b81613ae85760009050613b96565b8160018114613afe5760028114613b0857613b37565b6001915050613b96565b60ff841115613b1a57613b19612b1c565b5b8360020a915084821115613b3157613b30612b1c565b5b50613b96565b5060208310610133831016604e8410600b8410161715613b6c5782820a905083811115613b6757613b66612b1c565b5b613b96565b613b798484846001613a77565b92509050818404811115613b9057613b8f612b1c565b5b81810290505b9392505050565b6000613ba882611fb5565b9150613bb383611fb5565b9250613be07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613aca565b905092915050565b6000613bf382611fb5565b9150613bfe83611fb5565b9250828203905081811115613c1657613c15612b1c565b5b92915050565b7f3c2f646566733e00000000000000000000000000000000000000000000000000815250565b7f3c726563742077696474683d2200000000000000000000000000000000000000815250565b7f3c672069643d226b616c6569646f73636f706554696c6522207472616e73666f60008201527f726d3d227472616e736c61746528000000000000000000000000000000000000602082015250565b6000613cc4602e83612ba5565b9150613ccf82613c68565b602e82019050919050565b6000613ce68288612c22565b9150613cf182613c1c565b600782019150613d0082613c42565b600d82019150613d108287612c22565b9150613d1b826137d1565b600a82019150613d2b8286612c22565b9150613d36826132b5565b600882019150613d468285612c22565b9150613d51826139c2565b600982019150613d6082613cb7565b9150613d6c8284612c22565b91508190509695505050505050565b6000613d8682613243565b600c82019150613d968285612c22565b9150613da182613269565b600682019150613db18284612c22565b9150613dbc8261328f565b6005820191508190509392505050565b7f222066696c6c3d226e6f6e652200000000000000000000000000000000000000815250565b7f2f3e000000000000000000000000000000000000000000000000000000000000815250565b6000613e248286612c22565b9150613e308285612c22565b9150613e3b82613dcc565b600d82019150613e4b8284612c22565b9150613e5682613df2565b600282019150819050949350505050565b7f29223e0000000000000000000000000000000000000000000000000000000000815250565b7f22202f3e00000000000000000000000000000000000000000000000000000000815250565b6000613ebf8289612c22565b9150613eca826134aa565b600182019150613eda8288612c22565b9150613ee582613e67565b600382019150613ef58287612c22565b9150613f018286612c22565b9150613f0c826132b5565b600882019150613f1c8285612c22565b9150613f2782613e8d565b600482019150613f378284612c22565b9150819050979650505050505050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000815250565b6000613f798285612c22565b9150613f858284612c22565b9150613f90826139e8565b600482019150613f9f82613f47565b6006820191508190509392505050565b7f7265637477696474680000000000000000000000000000000000000000000000815250565b6000613fe082613faf565b600982019150613ff08284612c22565b915081905092915050565b7f7265637468656967687400000000000000000000000000000000000000000000815250565b600061402c82613ffb565b600a8201915061403c8284612c22565b915081905092915050565b7f726563746475726174696f6e0000000000000000000000000000000000000000815250565b600061407882614047565b600c820191506140888284612c22565b915081905092915050565b600061409e82611fb5565b91506140a983611fb5565b9250826140b9576140b8612fea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6140fc81611fb5565b82525050565b600060408201905061411760008301856140f3565b61412460208301846140f3565b9392505050565b60008151905061413a81611fbf565b92915050565b60006060828403121561415657614155611ee9565b5b6141606060611f5f565b905060006141708482850161412b565b60008301525060206141848482850161412b565b60208301525060406141988482850161412b565b60408301525092915050565b60006141b76141b28461231b565b611f5f565b905080838252602082019050606084028301858111156141da576141d9612347565b5b835b8181101561420357806141ef8882614140565b8452602084019350506060810190506141dc565b5050509392505050565b600082601f83011261422257614221612316565b5b81516142328482602086016141a4565b91505092915050565b60006020828403121561425157614250611edf565b5b600082015167ffffffffffffffff81111561426f5761426e611ee4565b5b61427b8482850161420d565b91505092915050565b7f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d60008201527f227472616e73666f726d2220747970653d22726f74617465222066726f6d3d2260208201527f302030202d000000000000000000000000000000000000000000000000000000604082015250565b6000614306604583612ba5565b915061431182614284565b604582019050919050565b7f2220746f3d222d3336302030202d000000000000000000000000000000000000815250565b7f2220626567696e3d22307322206475723d220000000000000000000000000000815250565b7f732220726570656174436f756e743d22696e646566696e69746522202f3e0000815250565b6000614399826142f9565b91506143a58286612c22565b91506143b08261431c565b600e820191506143c08285612c22565b91506143cb82614342565b6012820191506143db8284612c22565b91506143e682614368565b601e82019150819050949350505050565b7f3c726563742072783d2233222072793d22332220783d22302220793d222d0000815250565b7f3c2f726563743e00000000000000000000000000000000000000000000000000815250565b600061444e826143f7565b601e8201915061445e8288612c22565b9150614469826137ab565b6009820191506144798287612c22565b9150614484826137d1565b600a820191506144948286612c22565b915061449f826132b5565b6008820191506144af8285612c22565b91506144ba826132db565b6002820191506144ca8284612c22565b91506144d58261441d565b6007820191508190509695505050505050565b7f7931000000000000000000000000000000000000000000000000000000000000815250565b6000614519826144e8565b6002820191506145298284612c22565b915081905092915050565b7f7932000000000000000000000000000000000000000000000000000000000000815250565b600061456582614534565b6002820191506145758284612c22565b915081905092915050565b7f616c7465726e6174696e67436c61737300000000000000000000000000000000815250565b60006145b182614580565b6010820191506145c18284612c22565b915081905092915050565b60006145d782611f7f565b91506145e283611f7f565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211600084136000841316161561462157614620612b1c565b5b817f8000000000000000000000000000000000000000000000000000000000000000058312600084126000841316161561465e5761465d612b1c565b5b827f8000000000000000000000000000000000000000000000000000000000000000058212600084136000841216161561469b5761469a612b1c565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05821260008412600084121616156146d8576146d7612b1c565b5b828202905092915050565b60006146ee82611f7f565b91506146f983611f7f565b92508282039050818112600084121682821360008512151617156147205761471f612b1c565b5b92915050565b7f6475726174696f6e000000000000000000000000000000000000000000000000815250565b600061475782614726565b6008820191506147678284612c22565b915081905092915050565b600060ff82169050919050565b600061478a82614772565b915061479583614772565b9250828201905060ff8111156147ae576147ad612b1c565b5b92915050565b60006147bf82611f7f565b91507f800000000000000000000000000000000000000000000000000000000000000082036147f1576147f0612b1c565b5b816000039050919050565b7f2d00000000000000000000000000000000000000000000000000000000000000815250565b600061482d826147fc565b60018201915061483d8284612c22565b915081905092915050565b7f2e00000000000000000000000000000000000000000000000000000000000000815250565b600061487a8285612c22565b915061488582614848565b6001820191506148958284612c22565b91508190509392505050565b7f3c6c696e6561724772616469656e742069643d226772616469656e74223e0000815250565b7f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000815250565b7f222f3e0000000000000000000000000000000000000000000000000000000000815250565b7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22815250565b7f3c2f6c696e6561724772616469656e743e000000000000000000000000000000815250565b600061496a826148a1565b601e82019150614979826148c7565b601e820191506149898285612c22565b9150614994826148ed565b6003820191506149a382614913565b6020820191506149b38284612c22565b91506149be826148ed565b6003820191506149cd82614939565b6011820191508190509392505050565b60006149e98284612c22565b91508190509291505056fe0000000000c90f8801921d20025b26d703242abf03ed26e604b6195d057f00350647d97c0710a34507d95b9e08a2009a096a90490a3308bc0afb68050bc3ac350c8bd35e0d53db920e1bc2e40ee387660fab272b1072a0481139f0cf120116d512c8106e138edbb1145576b1151bdf8515e2144416a81305176dd9de183366e818f8b83c19bdcbf31a82a0251b4732ef1c0b826a1ccf8cb31d934fe51e56ca1e1f19f97b1fdcdc1b209f701c2161b39f2223a4c522e541af23a6887e2467775725280c5d25e845b626a8218527679df42826b92828e5714a29a3c4852a61b1012b1f34eb2bdc4e6f2c98fbba2d553afb2e110a622ecc681e2f8752623041c76030fbc54d31b54a5d326e54c73326e2c233def2873496824f354d905636041ad936ba2013376f9e46382493b038d8fe93398cdd323a402dd13af2eeb73ba51e293c56ba703d07c1d53db832a53e680b2c3f1749b73fc5ec974073f21d4121589a41ce1e64427a41d04325c13543d09aec447acd50452456bc45cd358f46756827471cece647c3c22e4869e664490f57ee49b415334a581c9d4afb6c974b9e038f4c3fdff34ce100344d8162c34e2106174ebfe8a44f5e08e24ffb654c5097fc5e5133cc9451ced46e5269126e53028517539b2aef5433027d54ca0a4a556040e255f5a4d2568a34a9571deef957b0d2555842dd5458d40e8c5964649759f3de125a8279995b1035ce5b9d11535c290acc5cb420df5d3e52365dc79d7b5e50015d5ed77c895f5e0db25fe3b38d60686cce60ec382f616f146b61f1003e6271fa6862f201ac637114cc63ef328f646c59bf64e889256563bf9165ddfbd266573cbb66cf811f6746c7d767bd0fbc683257aa68a69e806919e31f698c246b69fd614a6a6d98a36adcc9646b4af2786bb812d06c24295f6c8f351b6cf934fb6d6227f96dca0d146e30e3496e96a99c6efb5f116f5f02b16fc1938470231099708378fe70e2cbc571410804719e2cd171fa394872552c8472af05a67307c3cf735f662573b5ebd0740b53fa745f9dd074b2c8837504d3447555bd4b75a585ce75f42c0a7641af3c768e0ea576d9498877235f2c776c4eda77b417df77fab988784033287884841378c7aba17909a92c794a7c11798a23b079c89f6d7a05eeac7a4210d87a7d055a7ab6cba37aef63237b26cb4e7b5d039d7b920b887bc5e28f7bf8882f7c29fbed7c5a3d4f7c894bdd7cb727237ce3ceb17d0f42177d3980eb7d628ac57d8a5f3f7db0fdf77dd6668e7dfa98a77e1d93e97e3f57fe7e5fe4927e7f39567e9d55fb7eba3a387ed5e5c57ef0585f7f0991c37f2191b37f3857f57f4de4507f62368e7f754e7f7f872bf27f97cebc7fa736b37fb563b27fc255957fce0c3d7fd8878d7fe1c76a7fe9cbbf7ff094777ff621817ffa72d07ffd88597fff62157fffffff207374726f6b653d222345424139343722207374726f6b652d77696474683d223422a264697066735822122060b43bcc709c8721db4e21df0ab7e081bac711154950b01a7105fb15bd48e25864736f6c63430008100033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100935760003560e01c8063aa9e7e7511610066578063aa9e7e7514610158578063b3c34a5014610188578063c321118c146101b8578063d6cf5f55146101e8578063e3684e391461021857610093565b80631ac48ab1146100985780637d11e69c146100c85780638a0e9ad7146100f857806391b078a414610128575b600080fd5b6100b260048036038101906100ad919061212f565b610248565b6040516100bf91906121dc565b60405180910390f35b6100e260048036038101906100dd91906124e9565b6104cc565b6040516100ef91906121dc565b60405180910390f35b610112600480360381019061010d9190612547565b610c4e565b60405161011f9190612686565b60405180910390f35b610142600480360381019061013d91906126a2565b610e3a565b60405161014f919061283a565b60405180910390f35b610172600480360381019061016d91906128fd565b6110c6565b60405161017f91906121dc565b60405180910390f35b6101a2600480360381019061019d9190612547565b6111e8565b6040516101af91906129f1565b60405180910390f35b6101d260048036038101906101cd9190612a0d565b6115bc565b6040516101df91906121dc565b60405180910390f35b61020260048036038101906101fd9190612a0d565b6115f1565b60405161020f9190612b00565b60405180910390f35b610232600480360381019061022d9190612a0d565b611868565b60405161023f9190612b00565b60405180910390f35b606060006102598360800151611886565b6102668460a00151611886565b6102738560800151611886565b6102808660a00151611886565b61029960028860e001516102949190612b4b565b611886565b6040516020016102ad959493929190612cc5565b6040516020818303038152906040529050806102cc8460200151611a0e565b6102d98560600151611a0e565b6102e68660200151611a0e565b6102f38760600151611a0e565b61030c60028960e001516103079190612b4b565b611886565b60405160200161032196959493929190612dd8565b6040516020818303038152906040529050806103408460000151611a0e565b61034d8560400151611a0e565b61035a8660000151611a0e565b6103678760400151611a0e565b61038060028960e0015161037b9190612b4b565b611886565b60405160200161039596959493929190612ef8565b60405160208183030381529060405290506103ce6002846040015185600001516103bf9190612fa6565b6103c99190613019565b611a0e565b6103f66002856060015186602001516103e79190612fa6565b6103f19190613019565b611a0e565b61041e60028660a00151876080015161040f9190613083565b61041991906130b7565b611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588761010001516040518263ffffffff1660e01b815260040161045a9190613139565b600060405180830381865af4158015610477573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906104a091906131fa565b846040516020016104b5959493929190613327565b604051602081830303815290604052915050919050565b6060600060405180602001604052806000815250905060005b84606001518110156105405760006104fe868684610c4e565b90508261050a826110c6565b60405160200161051b9291906133cc565b6040516020818303038152906040529250508080610538906133f0565b9150506104e5565b50600060405180602001604052806000815250905060005b85604001518110156105b35760006105718787846111e8565b90508261057d82610248565b60405160200161058e9291906133cc565b60405160208183030381529060405292505080806105ab906133f0565b915050610558565b5060006040518060200160405280600081525090506000866020015163d693a4006105de91906130b7565b905060005b876020015181101561065b578261060682846105ff9190612b4b565b6007611a62565b6106158a608001516007611a62565b6106248b60a001516007611a62565b60405160200161063794939291906134f6565b60405160208183030381529060405292508080610653906133f0565b9150506105e3565b50600061066d88608001516007611a62565b61067c8960a001516007611a62565b61069760028b608001516106909190612b4b565b6007611a62565b6106a160c8611886565b6106ab60c8611886565b6040516020016106bf959493929190613650565b604051602081830303815290604052905060006106dd6101f4611886565b6106e86101f4611886565b6106f36101f4611886565b6106fe6101f4611886565b6108087301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588e604001516040518263ffffffff1660e01b815260040161073c9190613139565b600060405180830381865af4158015610759573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061078291906131fa565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588f60a001516040518263ffffffff1660e01b81526004016107bd9190613139565b600060405180830381865af41580156107da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061080391906131fa565b611acc565b8661081360c8611886565b610829600260c86108249190612b4b565b611886565b61083f600260c861083a9190612b4b565b611886565b604051602001610857999897969594939291906138b5565b6040516020818303038152906040529050808960c001516108f8577301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588a604001516040518263ffffffff1660e01b81526004016108ad9190613139565b600060405180830381865af41580156108ca573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108f391906131fa565b61092f565b6040518060400160405280600e81526020017f75726c28236772616469656e74290000000000000000000000000000000000008152505b87876040516020016109449493929190613a0e565b6040516020818303038152906040529050806109616101f4611886565b61096c6101f4611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588c608001516040518263ffffffff1660e01b81526004016109a79190613139565b600060405180830381865af41580156109c4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109ed91906131fa565b610a2b6007600a6109fe9190613b9d565b8e60800151610a0d91906130b7565b60026101f4610a1c91906130b7565b610a269190613be8565b611886565b604051602001610a3f959493929190613cda565b60405160208183030381529060405290506000610a618a608001516007611a62565b610a708b60a001516007611a62565b604051602001610a81929190613d7b565b6040516020818303038152906040529050600081610aab600860c8610aa69190613083565b611886565b8c6101000151610aca5760405180602001604052806000815250610ae4565b604051806060016040528060228152602001614df9602291395b604051602001610af693929190613e18565b604051602081830303815290604052905082610b466007600a610b199190613b9d565b8d60a00151610b2891906130b7565b60026101f4610b3791906130b7565b610b419190613be8565b611886565b83610b5160c8611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588f604001516040518263ffffffff1660e01b8152600401610b8c9190613139565b600060405180830381865af4158015610ba9573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610bd291906131fa565b8f6101000151610bf15760405180602001604052806000815250610bf3565b855b604051602001610c0896959493929190613eb3565b60405160208183030381529060405292508286604051602001610c2c929190613f6d565b6040516020818303038152906040529250829850505050505050505092915050565b610c56611d77565b610cd18460000151610c6784611886565b604051602001610c779190613fd5565b60405160208183030381529060405260026007600a610c969190613b9d565b8860a00151610ca591906130b7565b610caf91906130b7565b6007600a610cbd9190613b9d565b8860a00151610ccc91906130b7565b611af8565b816000018181525050610d558460000151610ceb84611886565b604051602001610cfb9190614021565b6040516020818303038152906040526007600a610d189190613b9d565b8760a00151610d2791906130b7565b600860c8610d3591906130b7565b60028960a00151610d469190612b4b565b610d509190613083565b611af8565b81602001818152505060008160400181815250506007600a610d779190613b9d565b8460a00151610d8691906130b7565b816060018181525050610dc88460000151610da084611886565b604051602001610db0919061406d565b6040516020818303038152906040526005600a611af8565b8160800181815250506000600283610de09190614093565b14610e0a578260e00151600081518110610dfd57610dfc6140c4565b5b6020026020010151610e2b565b8260c00151600081518110610e2257610e216140c4565b5b60200260200101515b8160a001819052509392505050565b610e42611db3565b610e8a82600001516040518060400160405280600a81526020017f7072696d617279487565000000000000000000000000000000000000000000008152506000610168611af8565b8160000181815250508160e00151610ea6578060000151610ec5565b61016860f08260000151610eba9190613083565b610ec49190614093565b5b81602001818152505060405180606001604052808260000151815260200160648152602001601e8152508160400181905250604051806060016040528082602001518152602001606481526020016046815250816060018190525060405180606001604052808260000151815260200160648152602001600a81525081608001819052506040518060600160405280610168600a8460000151610f689190613083565b610f729190614093565b815260200160648152602001600a8152508160a001819052507301e833cf8c115bb859a8e16a72d5ff298f834413635c1b88f9826000015160018560400151610fbb9190613083565b6040518363ffffffff1660e01b8152600401610fd8929190614102565b600060405180830381865af4158015610ff5573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061101e919061423b565b8160c001819052507301e833cf8c115bb859a8e16a72d5ff298f834413635c1b88f98260200151600185604001516110569190613083565b6040518363ffffffff1660e01b8152600401611073929190614102565b600060405180830381865af4158015611090573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906110b9919061423b565b8160e00181905250919050565b606060006110d78360600151611886565b6110e48460600151611886565b6110f18560800151611886565b6040516020016111039392919061438e565b60405160208183030381529060405290506111218360600151611886565b61112e8460000151611886565b61113b8560200151611886565b7301e833cf8c115bb859a8e16a72d5ff298f834413636e6472588760a001516040518263ffffffff1660e01b81526004016111769190613139565b600060405180830381865af4158015611193573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906111bc91906131fa565b846040516020016111d1959493929190614443565b604051602081830303815290604052915050919050565b6111f0611e10565b6000600860c861120091906130b7565b6007600a61120e9190613b9d565b8660a0015161121d91906130b7565b6112279190613083565b9050611261856000015161123a85611886565b60405160200161124a919061450e565b604051602081830303815290604052601484611af8565b8260200181815250506112a2856000015161127b85611886565b60405160200161128b919061455a565b604051602081830303815290604052601484611af8565b8260600181815250506112e485600001516112bc85611886565b6040516020016112cc91906145a6565b60405160208183030381529060405260006003611af8565b8260c0018181525050816060015182602001511380156113145750600060028360c001516113129190614093565b145b1561133c57600082602001519050826060015183602001818152505080836060018181525050505b600085608001516103e88760a001516113559190612b4b565b61135f91906130b7565b9050600060026007600a6113739190613b9d565b886080015161138291906130b7565b61138c9190612b4b565b90506113d96103e8846103e887602001516113a79190612b4b565b6113b191906130b7565b6103e86113be9190613be8565b836113c99190612b4b565b6113d391906130b7565b82611b68565b84608001818152505061142d6103e8846103e887606001516113fb9190612b4b565b61140591906130b7565b6103e86114129190613be8565b8361141d9190612b4b565b61142791906130b7565b82611b68565b8460a00181815250506000826103e8866020015161144b91906145cc565b6114559190613019565b90506002856080015161146891906145cc565b8161147391906146e3565b8560000181815250506000836103e8876060015161149191906145cc565b61149b9190613019565b905060028660a001516114ae91906145cc565b816007600a6114bd9190613b9d565b8b608001516114cc91906130b7565b60026114d891906145cc565b6114e291906146e3565b6114ec9190612fa6565b86604001818152505061152e896000015161150689611886565b604051602001611516919061474c565b60405160208183030381529060405260036007611af8565b8660e001818152505060006002886115469190614093565b1461157b578760e0015160018861155d9190613083565b8151811061156e5761156d6140c4565b5b60200260200101516115a7565b8760c0015160018861158d9190613083565b8151811061159e5761159d6140c4565b5b60200260200101515b86610100018190525050505050509392505050565b606060006115c9836115f1565b905060006115d682610e3a565b905060006115e483836104cc565b9050809350505050919050565b6115f9611e62565b81816000018181525050611646826040518060400160405280600b81526020017f72657065746974696f6e7300000000000000000000000000000000000000000081525060036014611af8565b816020018181525050611692826040518060400160405280601281526020017f6e756d496e7369646541727469666163747300000000000000000000000000008152506003600a611af8565b8160400181815250506116de826040518060400160405280601381526020017f6e756d4f7574736964654172746966616374730000000000000000000000000081525060016004611af8565b816060018181525050600561172c836040518060400160405280600b81526020017f6861734772616469656e740000000000000000000000000000000000000000008152506001600a611af8565b148160c00190151590811515815250506008611781836040518060400160405280600e81526020017f7365636f6e64617279436f6c6f7200000000000000000000000000000000000081525060016008611af8565b148160e0019015159081151581525050600060b4672b992ddfa23249d6600284602001516101686117b291906130b7565b60b46117be9190613be8565b6117c891906130b7565b6117d29190612b4b565b6117dc91906130b7565b9050600760126117ec9190613be8565b600a6117f89190613b9d565b61180182611b81565b60c861180d91906145cc565b6118179190613019565b8260800181815250506007601261182e9190613be8565b600a61183a9190613b9d565b61184382611bae565b60c861184f91906145cc565b6118599190613019565b8260a001818152505050919050565b611870611e62565b600061187b836115f1565b905080915050919050565b6060600082036118cd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611a09565b600082905060005b600082146118ff5780806118e8906133f0565b915050600a826118f891906130b7565b91506118d5565b60008167ffffffffffffffff81111561191b5761191a611eff565b5b6040519080825280601f01601f19166020018201604052801561194d5781602001600182028036833780820191505090505b50905060008290505b60008614611a015760018161196b9190613be8565b90506000600a808861197d91906130b7565b6119879190612b4b565b876119929190613be8565b603061199e919061477f565b905060008160f81b9050808484815181106119bc576119bb6140c4565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886119f891906130b7565b97505050611956565b819450505050505b919050565b60606000821215611a5157611a2b82611a26906147b4565b611886565b604051602001611a3b9190614822565b6040516020818303038152906040529050611a5d565b611a5a82611886565b90505b919050565b6060611a8482600a611a749190613b9d565b84611a7f91906130b7565b611886565b611aa483600a611a949190613b9d565b85611a9f9190614093565b611886565b604051602001611ab592919061486e565b604051602081830303815290604052905092915050565b60608282604051602001611ae192919061495f565b604051602081830303815290604052905092915050565b600080611b2d85611b0888611886565b604051602001611b199291906133cc565b604051602081830303815290604052611d44565b90508360018585611b3e9190613be8565b611b489190613083565b82611b539190614093565b611b5d9190613083565b915050949350505050565b6000818310611b775781611b79565b825b905092915050565b6000611ba76002672b992ddfa23249d681611b9f57611b9e612fea565b5b048301611bae565b9050919050565b6000672b992ddfa23249d6600202672b992ddfa23249d66002028381611bd757611bd6612fea565b5b06634000000063ffffffff160281611bf257611bf1612fea565b5b0491506000600160106001901b0360106008601c030384901c1690506000600160086001901b036008601c0385901c169050600080631000000063ffffffff168616149050600080632000000063ffffffff1687161415905081611c5b57826001610100030392505b600060405180610440016040528061040481526020016149f5610404913990506000600460ff1660028601029050600081830151905060006001600460080260ff166001901b03600460080260ff1683901c16905060006001600460080260ff166001901b0383169050600060108a84840302901c9050600088611ce157818303611ce5565b8184015b90508715611d13577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810290505b637fffffff670de0b6b3a7640000820281611d3157611d30612fea565b5b059b505050505050505050505050919050565b600081604051602001611d5791906149dd565b6040516020818303038152906040528051906020012060001c9050919050565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001611dad611eb4565b81525090565b6040518061010001604052806000815260200160008152602001611dd5611eb4565b8152602001611de2611eb4565b8152602001611def611eb4565b8152602001611dfc611eb4565b815260200160608152602001606081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001611e5c611eb4565b81525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581526020016000151581526020016000151581525090565b60405180606001604052806000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611f3782611eee565b810181811067ffffffffffffffff82111715611f5657611f55611eff565b5b80604052505050565b6000611f69611ed5565b9050611f758282611f2e565b919050565b600080fd5b6000819050919050565b611f9281611f7f565b8114611f9d57600080fd5b50565b600081359050611faf81611f89565b92915050565b6000819050919050565b611fc881611fb5565b8114611fd357600080fd5b50565b600081359050611fe581611fbf565b92915050565b60006060828403121561200157612000611ee9565b5b61200b6060611f5f565b9050600061201b84828501611fd6565b600083015250602061202f84828501611fd6565b602083015250604061204384828501611fd6565b60408301525092915050565b6000610160828403121561206657612065611ee9565b5b612071610120611f5f565b9050600061208184828501611fa0565b600083015250602061209584828501611fa0565b60208301525060406120a984828501611fa0565b60408301525060606120bd84828501611fa0565b60608301525060806120d184828501611fd6565b60808301525060a06120e584828501611fd6565b60a08301525060c06120f984828501611fd6565b60c08301525060e061210d84828501611fd6565b60e08301525061010061212284828501611feb565b6101008301525092915050565b6000610160828403121561214657612145611edf565b5b60006121548482850161204f565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561219757808201518184015260208101905061217c565b60008484015250505050565b60006121ae8261215d565b6121b88185612168565b93506121c8818560208601612179565b6121d181611eee565b840191505092915050565b600060208201905081810360008301526121f681846121a3565b905092915050565b60008115159050919050565b612213816121fe565b811461221e57600080fd5b50565b6000813590506122308161220a565b92915050565b6000610120828403121561224d5761224c611ee9565b5b612258610120611f5f565b9050600061226884828501611fd6565b600083015250602061227c84828501611fd6565b602083015250604061229084828501611fd6565b60408301525060606122a484828501611fd6565b60608301525060806122b884828501611fd6565b60808301525060a06122cc84828501611fd6565b60a08301525060c06122e084828501612221565b60c08301525060e06122f484828501612221565b60e08301525061010061230984828501612221565b6101008301525092915050565b600080fd5b600067ffffffffffffffff82111561233657612335611eff565b5b602082029050602081019050919050565b600080fd5b600061235f61235a8461231b565b611f5f565b9050808382526020820190506060840283018581111561238257612381612347565b5b835b818110156123ab57806123978882611feb565b845260208401935050606081019050612384565b5050509392505050565b600082601f8301126123ca576123c9612316565b5b81356123da84826020860161234c565b91505092915050565b600061020082840312156123fa576123f9611ee9565b5b612405610100611f5f565b9050600061241584828501611fd6565b600083015250602061242984828501611fd6565b602083015250604061243d84828501611feb565b60408301525060a061245184828501611feb565b60608301525061010061246684828501611feb565b60808301525061016061247b84828501611feb565b60a0830152506101c082013567ffffffffffffffff8111156124a05761249f611f7a565b5b6124ac848285016123b5565b60c0830152506101e082013567ffffffffffffffff8111156124d1576124d0611f7a565b5b6124dd848285016123b5565b60e08301525092915050565b600080610140838503121561250157612500611edf565b5b600061250f85828601612236565b92505061012083013567ffffffffffffffff81111561253157612530611ee4565b5b61253d858286016123e3565b9150509250929050565b6000806000610160848603121561256157612560611edf565b5b600061256f86828701612236565b93505061012084013567ffffffffffffffff81111561259157612590611ee4565b5b61259d868287016123e3565b9250506101406125af86828701611fd6565b9150509250925092565b6125c281611fb5565b82525050565b6060820160008201516125de60008501826125b9565b5060208201516125f160208501826125b9565b50604082015161260460408501826125b9565b50505050565b6101008201600082015161262160008501826125b9565b50602082015161263460208501826125b9565b50604082015161264760408501826125b9565b50606082015161265a60608501826125b9565b50608082015161266d60808501826125b9565b5060a082015161268060a08501826125c8565b50505050565b60006101008201905061269c600083018461260a565b92915050565b600061012082840312156126b9576126b8611edf565b5b60006126c784828501612236565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600061270883836125c8565b60608301905092915050565b6000602082019050919050565b600061272c826126d0565b61273681856126db565b9350612741836126ec565b8060005b8381101561277257815161275988826126fc565b975061276483612714565b925050600181019050612745565b5085935050505092915050565b60006102008301600083015161279860008601826125b9565b5060208301516127ab60208601826125b9565b5060408301516127be60408601826125c8565b5060608301516127d160a08601826125c8565b5060808301516127e56101008601826125c8565b5060a08301516127f96101608601826125c8565b5060c08301518482036101c08601526128128282612721565b91505060e08301518482036101e086015261282d8282612721565b9150508091505092915050565b60006020820190508181036000830152612854818461277f565b905092915050565b6000610100828403121561287357612872611ee9565b5b61287d60c0611f5f565b9050600061288d84828501611fd6565b60008301525060206128a184828501611fd6565b60208301525060406128b584828501611fd6565b60408301525060606128c984828501611fd6565b60608301525060806128dd84828501611fd6565b60808301525060a06128f184828501611feb565b60a08301525092915050565b6000610100828403121561291457612913611edf565b5b60006129228482850161285c565b91505092915050565b61293481611f7f565b82525050565b61016082016000820151612951600085018261292b565b506020820151612964602085018261292b565b506040820151612977604085018261292b565b50606082015161298a606085018261292b565b50608082015161299d60808501826125b9565b5060a08201516129b060a08501826125b9565b5060c08201516129c360c08501826125b9565b5060e08201516129d660e08501826125b9565b506101008201516129eb6101008501826125c8565b50505050565b600061016082019050612a07600083018461293a565b92915050565b600060208284031215612a2357612a22611edf565b5b6000612a3184828501611fd6565b91505092915050565b612a43816121fe565b82525050565b61012082016000820151612a6060008501826125b9565b506020820151612a7360208501826125b9565b506040820151612a8660408501826125b9565b506060820151612a9960608501826125b9565b506080820151612aac60808501826125b9565b5060a0820151612abf60a08501826125b9565b5060c0820151612ad260c0850182612a3a565b5060e0820151612ae560e0850182612a3a565b50610100820151612afa610100850182612a3a565b50505050565b600061012082019050612b166000830184612a49565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b5682611fb5565b9150612b6183611fb5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b9a57612b99612b1c565b5b828202905092915050565b600081905092915050565b7f3c616e696d617465206174747269627574654e616d653d2272222076616c756560008201527f733d220000000000000000000000000000000000000000000000000000000000602082015250565b6000612c0c602383612ba5565b9150612c1782612bb0565b602382019050919050565b6000612c2d8261215d565b612c378185612ba5565b9350612c47818560208601612179565b80840191505092915050565b7f3b00000000000000000000000000000000000000000000000000000000000000815250565b7f222063616c634d6f64653d226c696e65617222206475723d2200000000000000815250565b7f732220726570656174436f756e743d22696e646566696e697465222f3e000000815250565b6000612cd082612bff565b9150612cdc8288612c22565b9150612ce782612c53565b600182019150612cf78287612c22565b9150612d0282612c53565b600182019150612d128286612c22565b9150612d1d82612c53565b600182019150612d2d8285612c22565b9150612d3882612c79565b601982019150612d488284612c22565b9150612d5382612c9f565b601d820191508190509695505050505050565b7f3c616e696d617465206174747269627574654e616d653d226379222076616c7560008201527f65733d2200000000000000000000000000000000000000000000000000000000602082015250565b6000612dc2602483612ba5565b9150612dcd82612d66565b602482019050919050565b6000612de48289612c22565b9150612def82612db5565b9150612dfb8288612c22565b9150612e0682612c53565b600182019150612e168287612c22565b9150612e2182612c53565b600182019150612e318286612c22565b9150612e3c82612c53565b600182019150612e4c8285612c22565b9150612e5782612c79565b601982019150612e678284612c22565b9150612e7282612c9f565b601d82019150819050979650505050505050565b7f3c616e696d617465206174747269627574654e616d653d226378222076616c7560008201527f65733d2200000000000000000000000000000000000000000000000000000000602082015250565b6000612ee2602483612ba5565b9150612eed82612e86565b602482019050919050565b6000612f048289612c22565b9150612f0f82612ed5565b9150612f1b8288612c22565b9150612f2682612c53565b600182019150612f368287612c22565b9150612f4182612c53565b600182019150612f518286612c22565b9150612f5c82612c53565b600182019150612f6c8285612c22565b9150612f7782612c79565b601982019150612f878284612c22565b9150612f9282612c9f565b601d82019150819050979650505050505050565b6000612fb182611f7f565b9150612fbc83611f7f565b925082820190508281121560008312168382126000841215161715612fe457612fe3612b1c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061302482611f7f565b915061302f83611f7f565b92508261303f5761303e612fea565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161561307857613077612b1c565b5b828205905092915050565b600061308e82611fb5565b915061309983611fb5565b92508282019050808211156130b1576130b0612b1c565b5b92915050565b60006130c282611fb5565b91506130cd83611fb5565b9250826130dd576130dc612fea565b5b828204905092915050565b6130f181611fb5565b82525050565b60608201600082015161310d60008501826130e8565b50602082015161312060208501826130e8565b50604082015161313360408501826130e8565b50505050565b600060608201905061314e60008301846130f7565b92915050565b600080fd5b600067ffffffffffffffff82111561317457613173611eff565b5b61317d82611eee565b9050602081019050919050565b600061319d61319884613159565b611f5f565b9050828152602081018484840111156131b9576131b8613154565b5b6131c4848285612179565b509392505050565b600082601f8301126131e1576131e0612316565b5b81516131f184826020860161318a565b91505092915050565b6000602082840312156132105761320f611edf565b5b600082015167ffffffffffffffff81111561322e5761322d611ee4565b5b61323a848285016131cc565b91505092915050565b7f3c636972636c652063783d220000000000000000000000000000000000000000815250565b7f222063793d220000000000000000000000000000000000000000000000000000815250565b7f2220723d22000000000000000000000000000000000000000000000000000000815250565b7f222066696c6c3d22000000000000000000000000000000000000000000000000815250565b7f223e000000000000000000000000000000000000000000000000000000000000815250565b7f3c2f636972636c653e0000000000000000000000000000000000000000000000815250565b600061333282613243565b600c820191506133428288612c22565b915061334d82613269565b60068201915061335d8287612c22565b91506133688261328f565b6005820191506133788286612c22565b9150613383826132b5565b6008820191506133938285612c22565b915061339e826132db565b6002820191506133ae8284612c22565b91506133b982613301565b6009820191508190509695505050505050565b60006133d88285612c22565b91506133e48284612c22565b91508190509392505050565b60006133fb82611fb5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361342d5761342c612b1c565b5b600182019050919050565b7f3c75736520687265663d222374696c6522207472616e73666f726d3d22726f7460008201527f6174652800000000000000000000000000000000000000000000000000000000602082015250565b6000613494602483612ba5565b915061349f82613438565b602482019050919050565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b7f2922202f3e000000000000000000000000000000000000000000000000000000815250565b60006135028287612c22565b915061350d82613487565b91506135198286612c22565b9150613524826134aa565b6001820191506135348285612c22565b915061353f826134aa565b60018201915061354f8284612c22565b915061355a826134d0565b60058201915081905095945050505050565b7f3c636c6970506174682069643d22636c6970223e000000000000000000000000815250565b7f3c7061746820643d224d302c304c000000000000000000000000000000000000815250565b7f4c00000000000000000000000000000000000000000000000000000000000000815250565b7f2c30410000000000000000000000000000000000000000000000000000000000815250565b7f2c302c302c302c302c305a22202f3e0000000000000000000000000000000000815250565b7f3c2f636c6970506174683e000000000000000000000000000000000000000000815250565b600061365b8261356c565b60148201915061366a82613592565b600e8201915061367a8288612c22565b9150613685826134aa565b6001820191506136958287612c22565b91506136a0826135b8565b6001820191506136b08286612c22565b91506136bb826135de565b6003820191506136cb8285612c22565b91506136d6826134aa565b6001820191506136e68284612c22565b91506136f182613604565b600f820191506137008261362a565b600b820191508190509695505050505050565b7f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323060008201527f30302f737667222076696577426f783d22302030200000000000000000000000602082015250565b600061376f603583612ba5565b915061377a82613713565b603582019050919050565b7f2000000000000000000000000000000000000000000000000000000000000000815250565b7f222077696474683d220000000000000000000000000000000000000000000000815250565b7f22206865696768743d2200000000000000000000000000000000000000000000815250565b7f223e3c646566733e000000000000000000000000000000000000000000000000815250565b7f3c672069643d2274696c652220636c69702d706174683d2275726c2823636c6960008201527f7029223e00000000000000000000000000000000000000000000000000000000602082015250565b6000613879602483612ba5565b91506138848261381d565b602482019050919050565b7f3c7265637420783d22302220793d222d00000000000000000000000000000000815250565b60006138c082613762565b91506138cc828c612c22565b91506138d782613785565b6001820191506138e7828b612c22565b91506138f2826137ab565b600982019150613902828a612c22565b915061390d826137d1565b600a8201915061391d8289612c22565b9150613928826137f7565b6008820191506139388288612c22565b91506139448287612c22565b915061394f8261386c565b915061395a8261388f565b60108201915061396a8286612c22565b9150613975826137ab565b6009820191506139858285612c22565b9150613990826137d1565b600a820191506139a08284612c22565b91506139ab826132b5565b6008820191508190509a9950505050505050505050565b7f223e3c2f726563743e0000000000000000000000000000000000000000000000815250565b7f3c2f673e00000000000000000000000000000000000000000000000000000000815250565b6000613a1a8287612c22565b9150613a268286612c22565b9150613a31826139c2565b600982019150613a418285612c22565b9150613a4d8284612c22565b9150613a58826139e8565b60048201915081905095945050505050565b60008160011c9050919050565b6000808291508390505b6001851115613ac157808604811115613a9d57613a9c612b1c565b5b6001851615613aac5780820291505b8081029050613aba85613a6a565b9450613a81565b94509492505050565b600082613ada5760019050613b96565b81613ae85760009050613b96565b8160018114613afe5760028114613b0857613b37565b6001915050613b96565b60ff841115613b1a57613b19612b1c565b5b8360020a915084821115613b3157613b30612b1c565b5b50613b96565b5060208310610133831016604e8410600b8410161715613b6c5782820a905083811115613b6757613b66612b1c565b5b613b96565b613b798484846001613a77565b92509050818404811115613b9057613b8f612b1c565b5b81810290505b9392505050565b6000613ba882611fb5565b9150613bb383611fb5565b9250613be07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484613aca565b905092915050565b6000613bf382611fb5565b9150613bfe83611fb5565b9250828203905081811115613c1657613c15612b1c565b5b92915050565b7f3c2f646566733e00000000000000000000000000000000000000000000000000815250565b7f3c726563742077696474683d2200000000000000000000000000000000000000815250565b7f3c672069643d226b616c6569646f73636f706554696c6522207472616e73666f60008201527f726d3d227472616e736c61746528000000000000000000000000000000000000602082015250565b6000613cc4602e83612ba5565b9150613ccf82613c68565b602e82019050919050565b6000613ce68288612c22565b9150613cf182613c1c565b600782019150613d0082613c42565b600d82019150613d108287612c22565b9150613d1b826137d1565b600a82019150613d2b8286612c22565b9150613d36826132b5565b600882019150613d468285612c22565b9150613d51826139c2565b600982019150613d6082613cb7565b9150613d6c8284612c22565b91508190509695505050505050565b6000613d8682613243565b600c82019150613d968285612c22565b9150613da182613269565b600682019150613db18284612c22565b9150613dbc8261328f565b6005820191508190509392505050565b7f222066696c6c3d226e6f6e652200000000000000000000000000000000000000815250565b7f2f3e000000000000000000000000000000000000000000000000000000000000815250565b6000613e248286612c22565b9150613e308285612c22565b9150613e3b82613dcc565b600d82019150613e4b8284612c22565b9150613e5682613df2565b600282019150819050949350505050565b7f29223e0000000000000000000000000000000000000000000000000000000000815250565b7f22202f3e00000000000000000000000000000000000000000000000000000000815250565b6000613ebf8289612c22565b9150613eca826134aa565b600182019150613eda8288612c22565b9150613ee582613e67565b600382019150613ef58287612c22565b9150613f018286612c22565b9150613f0c826132b5565b600882019150613f1c8285612c22565b9150613f2782613e8d565b600482019150613f378284612c22565b9150819050979650505050505050565b7f3c2f7376673e0000000000000000000000000000000000000000000000000000815250565b6000613f798285612c22565b9150613f858284612c22565b9150613f90826139e8565b600482019150613f9f82613f47565b6006820191508190509392505050565b7f7265637477696474680000000000000000000000000000000000000000000000815250565b6000613fe082613faf565b600982019150613ff08284612c22565b915081905092915050565b7f7265637468656967687400000000000000000000000000000000000000000000815250565b600061402c82613ffb565b600a8201915061403c8284612c22565b915081905092915050565b7f726563746475726174696f6e0000000000000000000000000000000000000000815250565b600061407882614047565b600c820191506140888284612c22565b915081905092915050565b600061409e82611fb5565b91506140a983611fb5565b9250826140b9576140b8612fea565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6140fc81611fb5565b82525050565b600060408201905061411760008301856140f3565b61412460208301846140f3565b9392505050565b60008151905061413a81611fbf565b92915050565b60006060828403121561415657614155611ee9565b5b6141606060611f5f565b905060006141708482850161412b565b60008301525060206141848482850161412b565b60208301525060406141988482850161412b565b60408301525092915050565b60006141b76141b28461231b565b611f5f565b905080838252602082019050606084028301858111156141da576141d9612347565b5b835b8181101561420357806141ef8882614140565b8452602084019350506060810190506141dc565b5050509392505050565b600082601f83011261422257614221612316565b5b81516142328482602086016141a4565b91505092915050565b60006020828403121561425157614250611edf565b5b600082015167ffffffffffffffff81111561426f5761426e611ee4565b5b61427b8482850161420d565b91505092915050565b7f3c616e696d6174655472616e73666f726d206174747269627574654e616d653d60008201527f227472616e73666f726d2220747970653d22726f74617465222066726f6d3d2260208201527f302030202d000000000000000000000000000000000000000000000000000000604082015250565b6000614306604583612ba5565b915061431182614284565b604582019050919050565b7f2220746f3d222d3336302030202d000000000000000000000000000000000000815250565b7f2220626567696e3d22307322206475723d220000000000000000000000000000815250565b7f732220726570656174436f756e743d22696e646566696e69746522202f3e0000815250565b6000614399826142f9565b91506143a58286612c22565b91506143b08261431c565b600e820191506143c08285612c22565b91506143cb82614342565b6012820191506143db8284612c22565b91506143e682614368565b601e82019150819050949350505050565b7f3c726563742072783d2233222072793d22332220783d22302220793d222d0000815250565b7f3c2f726563743e00000000000000000000000000000000000000000000000000815250565b600061444e826143f7565b601e8201915061445e8288612c22565b9150614469826137ab565b6009820191506144798287612c22565b9150614484826137d1565b600a820191506144948286612c22565b915061449f826132b5565b6008820191506144af8285612c22565b91506144ba826132db565b6002820191506144ca8284612c22565b91506144d58261441d565b6007820191508190509695505050505050565b7f7931000000000000000000000000000000000000000000000000000000000000815250565b6000614519826144e8565b6002820191506145298284612c22565b915081905092915050565b7f7932000000000000000000000000000000000000000000000000000000000000815250565b600061456582614534565b6002820191506145758284612c22565b915081905092915050565b7f616c7465726e6174696e67436c61737300000000000000000000000000000000815250565b60006145b182614580565b6010820191506145c18284612c22565b915081905092915050565b60006145d782611f7f565b91506145e283611f7f565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211600084136000841316161561462157614620612b1c565b5b817f8000000000000000000000000000000000000000000000000000000000000000058312600084126000841316161561465e5761465d612b1c565b5b827f8000000000000000000000000000000000000000000000000000000000000000058212600084136000841216161561469b5761469a612b1c565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff05821260008412600084121616156146d8576146d7612b1c565b5b828202905092915050565b60006146ee82611f7f565b91506146f983611f7f565b92508282039050818112600084121682821360008512151617156147205761471f612b1c565b5b92915050565b7f6475726174696f6e000000000000000000000000000000000000000000000000815250565b600061475782614726565b6008820191506147678284612c22565b915081905092915050565b600060ff82169050919050565b600061478a82614772565b915061479583614772565b9250828201905060ff8111156147ae576147ad612b1c565b5b92915050565b60006147bf82611f7f565b91507f800000000000000000000000000000000000000000000000000000000000000082036147f1576147f0612b1c565b5b816000039050919050565b7f2d00000000000000000000000000000000000000000000000000000000000000815250565b600061482d826147fc565b60018201915061483d8284612c22565b915081905092915050565b7f2e00000000000000000000000000000000000000000000000000000000000000815250565b600061487a8285612c22565b915061488582614848565b6001820191506148958284612c22565b91508190509392505050565b7f3c6c696e6561724772616469656e742069643d226772616469656e74223e0000815250565b7f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d220000815250565b7f222f3e0000000000000000000000000000000000000000000000000000000000815250565b7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d22815250565b7f3c2f6c696e6561724772616469656e743e000000000000000000000000000000815250565b600061496a826148a1565b601e82019150614979826148c7565b601e820191506149898285612c22565b9150614994826148ed565b6003820191506149a382614913565b6020820191506149b38284612c22565b91506149be826148ed565b6003820191506149cd82614939565b6011820191508190509392505050565b60006149e98284612c22565b91508190509291505056fe0000000000c90f8801921d20025b26d703242abf03ed26e604b6195d057f00350647d97c0710a34507d95b9e08a2009a096a90490a3308bc0afb68050bc3ac350c8bd35e0d53db920e1bc2e40ee387660fab272b1072a0481139f0cf120116d512c8106e138edbb1145576b1151bdf8515e2144416a81305176dd9de183366e818f8b83c19bdcbf31a82a0251b4732ef1c0b826a1ccf8cb31d934fe51e56ca1e1f19f97b1fdcdc1b209f701c2161b39f2223a4c522e541af23a6887e2467775725280c5d25e845b626a8218527679df42826b92828e5714a29a3c4852a61b1012b1f34eb2bdc4e6f2c98fbba2d553afb2e110a622ecc681e2f8752623041c76030fbc54d31b54a5d326e54c73326e2c233def2873496824f354d905636041ad936ba2013376f9e46382493b038d8fe93398cdd323a402dd13af2eeb73ba51e293c56ba703d07c1d53db832a53e680b2c3f1749b73fc5ec974073f21d4121589a41ce1e64427a41d04325c13543d09aec447acd50452456bc45cd358f46756827471cece647c3c22e4869e664490f57ee49b415334a581c9d4afb6c974b9e038f4c3fdff34ce100344d8162c34e2106174ebfe8a44f5e08e24ffb654c5097fc5e5133cc9451ced46e5269126e53028517539b2aef5433027d54ca0a4a556040e255f5a4d2568a34a9571deef957b0d2555842dd5458d40e8c5964649759f3de125a8279995b1035ce5b9d11535c290acc5cb420df5d3e52365dc79d7b5e50015d5ed77c895f5e0db25fe3b38d60686cce60ec382f616f146b61f1003e6271fa6862f201ac637114cc63ef328f646c59bf64e889256563bf9165ddfbd266573cbb66cf811f6746c7d767bd0fbc683257aa68a69e806919e31f698c246b69fd614a6a6d98a36adcc9646b4af2786bb812d06c24295f6c8f351b6cf934fb6d6227f96dca0d146e30e3496e96a99c6efb5f116f5f02b16fc1938470231099708378fe70e2cbc571410804719e2cd171fa394872552c8472af05a67307c3cf735f662573b5ebd0740b53fa745f9dd074b2c8837504d3447555bd4b75a585ce75f42c0a7641af3c768e0ea576d9498877235f2c776c4eda77b417df77fab988784033287884841378c7aba17909a92c794a7c11798a23b079c89f6d7a05eeac7a4210d87a7d055a7ab6cba37aef63237b26cb4e7b5d039d7b920b887bc5e28f7bf8882f7c29fbed7c5a3d4f7c894bdd7cb727237ce3ceb17d0f42177d3980eb7d628ac57d8a5f3f7db0fdf77dd6668e7dfa98a77e1d93e97e3f57fe7e5fe4927e7f39567e9d55fb7eba3a387ed5e5c57ef0585f7f0991c37f2191b37f3857f57f4de4507f62368e7f754e7f7f872bf27f97cebc7fa736b37fb563b27fc255957fce0c3d7fd8878d7fe1c76a7fe9cbbf7ff094777ff621817ffa72d07ffd88597fff62157fffffff207374726f6b653d222345424139343722207374726f6b652d77696474683d223422a264697066735822122060b43bcc709c8721db4e21df0ab7e081bac711154950b01a7105fb15bd48e25864736f6c63430008100033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.