ETH Price: $3,073.31 (+0.80%)
Gas: 4 Gwei

Token

MettiForRoeVWade (METTI4ROE)
 

Overview

Max Total Supply

735 METTI4ROE

Holders

456

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
niklas.eth
Balance
6 METTI4ROE
0x6224fd05D32B5e9Ea20D61BFd10A5DCC2Db6E76c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MettiForRoeVWade

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-29
*/

//Metti For Roe v. Wade is a NFT art collection from Pumpametti to support a woman's right to choose. SCOTUS' overturn of Roe v. Wade further distances America from one of the core principles of American constitutional democracy, the separation of church and state. 
//Free mint of 1000 art pieces, 300 reserved for OG Pumpametti collectors. 
//All royalties from this collection will go to support non-profit organizations fighting for women's reproductive rights.

// ####%#####*###**####%##%#########%#*###*+**###%%######%######*##*#**###########*#########%#######################*####%######%%#%%#%%%%%%%%%%%%%@@%%@%
// ################%#####*#**#*##*#*#*#*##*##**#*##*##*##*#**#*##########**#######*###################*##*#*##############%*%####%%%%%%%%%%%%%%%%%@@@@@@@
// #####################***#**#######*###########*==*#*#*######**####*###*##############**##*###**#######***####%###########%#####%%%%%%%%%%%%%%%%%%%@%@@
// *##**####*##+**##################-*#########-+*++*#*########**##*#################*######*###**##################%#####%#%%##%%%#%#%%%%%%%%%%@@%%%%%%%
// ***#######*:*:*#####%####*####.#++######*+=#########*############*#######*######*#**##*#######################%####%###%*##%####%%%%%%%%%%%%%%%%%@%%%@
// ########**-*#-*######*######## =-+#####.+####################**###****#######**######################*##*####%############%%%%##%%%%%%%%%%%@%%%%@%%%@%
// ########:*##**####*-#=+#+##*+-:#**++*=*########################**######*####**######%##################*#########%%###%##%##%%%%%%%%%%%%%%%%%%%%%@%%%%
// *#*####+=*#*-*##-+---:+--+=-=-=*=-==#########################*#############*###*#########*#######***########################%#%%%%%%%%%%%%@%%%%%%%@%@%
// ****#%*.+#*---*-.===+.++**+*#+=-**###########################**#**#########*##################*####*##############%#########%%%%%%%%%%%%%%%%%%%%%%%@@%
// ##*##*:**#:***#***:*#*######+.#########*##############*####**#############**######%############**#######*####%####%####%#####%%%#%%#%%%%%%%%%%%@%%@@@%
// ###*#*+=*:######*+-*###*#*+:*##*###*##########*#########################*##########*#############**%########%####################%#%%%%%#%%%%%%%%@@@@@
// #####-*=-#######+-**#*#*=-+#*##*##########***#################**###########################*##############%#########%%%#####%#%%%%%%#%%%%%%%%%%%%%@%@@
// #*##=#=+*######**-+***++=**#***####*******##*#####**#####***#####*################**########**#######*##**###%############%#%#%%#%%%##%%%%%%%%%@%%%%%@
// ####+#+####*##******+-*****###*#***#*##*##########*###*##*#####*########**#######**########**###****####**#######%##*###%%###%%#%#%#%%#%%%%%%%%%%@%%%%
// **#-#:###*#*#*#+ =*.**#*##***#***#*#*#****#**#####*#*#*#####*########*#*#######*###**+*##***#*####***#*#*###*###############%%#%###%%%%%%%%%%%%%%%%%%%
// ###=*=###*#*****:*-*****#**##*#*#*#**##*#####*###*#***##****################*+++*++**+**#****##**##*###########%#*#####%###%#%###%#%%%%%%%%%%#%%%%%%%%
// *#+*-*##*#%#**#*.=*#*##*##***#*#**##****###########*#########***####*#*#***+++**##*******##*##*####*####*############%##%####%##%%#%%%%%%%%%%%%%%%%%%%
// ##++=*######*#=:+###********++***##****#%*####******#########*#####*******#***######*+*##*#**#*####*#*##############%%#######%##%%%%%%#%%%%##%%%%@%@%%
// %+=-*###%#***=+**#*##**********#**#***#######******##########*###***#*###**#*****#*##+###*########**####*####################%###%%%%%%%##%#%%%%%%%%%%
// #*+##++#***=-#+****#+#**#*##*###**##*###*##**#****#*###***###*#####**+%#+******+##**#*#*###*#*#****#**####%####%%###########%####%%%%%%%%#%#%%%%%%@%%%
// *+=+#****#####***###+**+***#*###*%#**#####*******###**#####***#*##*###*+*+***+++******#*####*********#########%###%########%%###%%%%#%%%%%%%#%%%%%%%%%
// *-+######*#**###*#*#****####*#**##***#####*********#####**##***#*#**#***********#**********#*****##################%######%%%*###%%%%%%%%%%%%%%%%%%%%%
// ***#####*######%##*###*#*#*#####****#####******##**##*##***##***#***#***##******+*******####******##*###############%####%%%%*%%%%%%%%%#%%%%%%%%%%%%%%
// #*####%########*####*+*************######*****#######**********#*#******%#*#***++****+**###*+**#*###*###%###################%##%%%%%%#%##%%%%#%%%%%%%%
// *#####*****#**#++*#*****###*#*****#####******######*##**********#****%****+#**********#*###*##***#*##*##################%###%%%%%%#%%%%%##%%%%%%%%%%%%
// #****##**####**####*+**##**#***#**##%#****#*#**#**#*###**#*#*****#*#**####**********#######*##**########%######%###%######%#####%%%##%%%%%##%%%%%%%%%%
// ***######*###*#####**#**#*#******####*********####****####*##*########******#******#**#########*###*###%%#####%###%##%%#%#%##%###%%#%###%%%%%%%%%%%%%%
// #*****######**#****#*****##****###******#*#*##*#*******#**###########**###*#**#*****#####**#############%#%%%%##%%######%%###%%##%%##%%%%%%##%#%%%%%%%
// #####*#*****##****++****##*#*#*#####******#**#********##*#####*#####**######**#****##***###%%###***#####%#################%###%%###%%#%%%%##%%%%%%%%%%
// #**#**#******###****+*%#*****######*****#******#*#***#####*#**#*#%#######**%*#*#*#*#%#####%######****#%%#%%############%####%%%%#######%###%#%%%%%%%%%
// #**#*####**###*##*+*%*###**######***#####****#****##**#***#######**#******##***####*###################%##%##%%#%##%%%#######%##%%#%%%#%###%%%%%%%#%%%
// ***###****#***#****#%#############****#**=***##********#**#**#*******#******#*##*##*##########################%%##########%##%###%#%%%##%##%%%%%%%%%%%
// ****#***###****#****#***##**#*##*###*#***=***#*===**#*##**##*********#******####*###########**###%#%########%######%#####%%%########%##%%%%%##%%#%#%%%
// #**##*#####**###*****+**#######***#**#*#*=+=-=*+*--=*###**#**********#*###***##############%###*%%%#%%#%###%#####%%###%###%%%#*#######%##%%%###%#%%%%%
// ####*#*#*###*#************#*###########**=******=-------+#*-::+**#*#*####**####%##%%########*#%####%###############*#####%%######*##%%#%###%##%%%%%%%%
// *##*******#***#***+*#****######***####******#*****###*#*#+-----=***+**++++****######*###########%##%#%%#####%##%########%%%%##%##########%%%####%%%%%%
// **#****#****##***#******###**#**#####*##***************######*+====++==-:-==+###+++++#####%%####%###%###%%%#########%#%%##%#%##%#####%%%%#%###%#%%%%%#
// *####*####*******#*#*****###***###*#####=+***#*****+=:-#*##############*+*+=====::::-+###++====#########%%##########%%##%%#########%###%%####*#%%%%%%%
// *##########**##*****###*##**####***###**-=##*******+...###*##*###*:=####*#******#+::=*###-*****-=###%##%######%####%####%%#########%####%###%#%#%%%%%%
// ##**#***##********#**########*#*###*****-=*###*:..*=...###+######   +*#**######%##%%%*------:-:-=##%#######%%%%####%%%%%%%########*#%##########%%%#%%%
// #****#####*%#****##*###*####%##****#*#*#=+##**=...:....+##:..:+*.  .+####*#######%%%%###%##*=====++******####%##%%%#####%################%#####%%%%%#%
// ***##**##*#*###*#**#######%%##*****#**#+******-...:....#*#=..:--. .=#######+*##%%%%%%####*#%#####*++-+===##+++########%#%##########*###%#%###%%%%%%%%%
// #***##*******#**#***#%%%%%%###**#*****#-=**#**.........=***+++-   :*###*##=-+##%%%%#*#+--:*###*#####**==+###+-=+%%%#####%#########*###%%#####%%#%#%%%%
// **###**#**##***#**##*#%%%%###***#*#****-+****-::.......=******-  .*######*:.+##%::=-...  .:##*:###+:::-*#%%%###*----=*%#=+-*#%################%%%#%%%@
// *#*##*#**###*##*****%%%%%#*#####***###*--*###..:........*****#=  .#**####+.:+%%. .-..   :.=:...:*-... -*#*#%%#%%##%##=-----*##%#*%#*+#%##**#####%%%%%%
// *#####*#*+**********%%%##########*****#*=***=.:=.......-##**#*- :+#***#***::*%#. .===  .*=.:::+=+.:-:  :###%%%%#**#%###*#%#####*#==*########%#%##%#%%%
// *********+***######*%%%###**#####*#****=+***-:=*:...:...+#**#+ .+##**#*##+.-##%. .+#+. :*+.:=**#*.-#*  -**+*%%%= =#%#+-:*###%*#####*##%%####%#%###%#%@
// **********#################*##****#*##*-=***==**:..:=:..-**#*- -*##****%%=.*#%%. :*#+  -#+.:*###=. =-  :*==+%%#: +##*:..#%%%##%#######%#####%%#%##%%@@
// *###*####**##****#%#%##**###*****#***#*--*=-=***:..:+*...=##*. -*****####-.+##*. -##*  -#:..:..-* :#. .=*--*#%#. .#:.. *#####%%%#%=%%########%%%#%#%%%
// ##******+**#*########%###****###*#*****--*=:++++-...+*+..:+*+  +*****%%%+. :##=. -%#.  =#..   .#: -:.:***-=##%#  **    *###**#**####%%%#####%%%#%#%%@%
// *#%#######%##*#####%%#****####**##*#**=#**++=#**+::=##*::=##. .+*+**###%*: -##-..*%%-..=*:..--##    .=###=:*%%*..=#.....-*####*##+*=#%%%%#########%%%%
// ###**##***##############******#*##**##++###*################-.=**++*####+. :#*: .+##. =#*..-%%## . -=####-:*#%: .=*=+=:. .=*#####+%*%%#%%%###%##*#%%@%
// **#*#*##############*####*#########*#+*+##########*****#####*++***#######- .%=. :##=..*#=..*##*=   :##*#%..=%#...+%%%#*+. -*######%#%#%%%%######*%%%%%
// #######*####*#*#%######**####*#######+-*##*####*###*##*#%###*****##%#####- ... .###- .+#-..+-:..    .:-#%..:*+ .=#%:%%#%+ .=####+#==##%#%#####***#%%%%
// *##*#****###*####%##*#####**#########+-*###****###**-.+#**###*****####%###:...:*#%##.=#%-..::... -*.   :*-....  --:....   .+%#*#=+-+###@##%##*#%#%%@@%
// *#**#################**############**==*##*#*#*#+-::..+****#*+****###%####-:=-**+*##-#%%+*-*++-  -*-.  -##-.. :-++..      -*####%#-+%#%%##%%%@@%*#%%@%
// *#*################*#*#############*#+**#####*##**++-=******+--*#########=. .=+. :+#%#*+-=#*###..+##+=-+##*=-:####+: .  .:=#*#%#%%=*#%%%%%%%%@%@#%%%%@
// ***#################################*-+#*#########+=+*+##*+=::=#########%+. ...  :#%#::   -=#**==*###%##*+=+#+#%%##*:=:-=**#%%#***###%%%%%#%%%@%%%%%%%
// ***#####**##########################*:+*##%%#*####--+#**.....-*######%##+:  ..   .=*- .    :#####+#%#***:..=###%####*####%####*##-*%%%##%%%@@%@%@@%%%@
// #*##################################*-+#%###@#%#%%:=*##*.   .+##%###%##*..  ..  .-*#. .=+. .+=-%#==##==+-+:*###%%###*%#%###*##*##*=#%%%%%%%@@%%@%%@%%@
// ################*##################%*-*#######%%#=-=###*-:....-*#######+:       .-*=..=##- .=:.##==%#+=*+*###%#%%#*%%##%#%%#%###+*##%%%%%%%%%%%%%%%%%@
// #############################%######*+##%#*#####*..=+***##+=-..+###%%%#-      .. -*+.:#*#+. ::.*=-+#*+-*+####%%###*%#%%##%##**##+++##%%%###%%%@%%%%%@@
// #####################%#######%######*+####*###+-=....::::--+-. +#%%%#%-:..    :..=*+.-#*#.  .. :.:*#*-:-:-+##*%#####%%#*#%%##+##+=-#%%#%#%#%%%%%%@%%@@
// ####################%####%####%###*#*+###%%%##+=-.... ...  ..  +#%%##%. .=.  -+..-**.:==.  :=  .:+##*.....=####%###%#%%%##*##%%#=#-#@%%%@#%##%%@%%%%%@
// ####%###############################*-*%%###*####*+*:+:*.. ...=##%%##-.:+=. .=*-  :+: .   :*.  :=#%#...=:=**#*#%*#%%#%#****#*#%#=+%#%@%@%%#%%%@%%@%%@@
// #####################%##############+-*%%#*+=***###**#**+=:+*=#%%%%%%::+#*:-+**#.. -.  ..:#=..=.:=#%: :+++%%###*#%#%%#***#**####*=#%%%#@@#%%%%%%%%%%%@
// ###################%%#%#####%#######-=*##*+##*-+#***+==***+###%%%%%%#*+###+##***+=-+===++*#- :*-::==. . ..+##*%#%%#%%#*##*##%###*#*%%@%%@%%%@%%%%%%%%%
// **################%%%#############%*-+#%#=:*#%+=*+--:..*#*-=#%%%%%########**###*#*#%**####%+-+**:. ....  .-####%#%%%%**##+*#%###+=+@@@%@%##%%%%%%@@%%%
// *################%%#############%#%#:+%#*=-*%*.-*-=:::+*==..*%%%#%#%%#%#++*#####++#%#%#####%##%%#+-..#*****#*#%@%%%%%**%@%##%##%==#%#%%@@%#@%#%@@@%%%%
// ################%%%%%########%%%##%#:+##+.-*-..=##=***#*- .#%#%#-%#- =%*==%####- -#%#%*#*+*-###%%######%%**#%%#%%%%%%%#%%%####@%==#%%@@%#%%%%%%@@%%%%%
// ###############%%%##%######%%%%%%%%*:+%*.:-. ..=#*++++**=:+%%##+-%*..-##==*###+. .=##*==:..-%%*+:=##*+*+###*#%%##%%%%###*%##%%##=%-%%%@@%%%%%%%%@%%%@@
// ##**##########%#%%#########%%%%%#%%#:+*-..  .-+##+:.::*-:=%%+#%==#- .###+=#**+:  .-#-=..:.:-+=:...+%+=::=###%#%+###%%#*%*###%%#%*+*#%%@@#%%%%%%%@%%%%@
// #############%%##%#%#######%%%%%%#%#-+-..=..+*%##:..:=#: .*=.=+:-#- .+##+:+**=  +.:*-**++**+......+#-:-:.++#%#*#%#%#%########@%%#-@#%%@@#%%%%%%%@%%@@@
// *#######*#%%#%%%%###%#####%%%%%%%%%#-++.+-..*#%##..=#%+. .+. -+:**:  ***-:+##=  ...+%#*==%%*..=-####..=*-.:*%*#%###*#*#%%##%#%@#--%@@%@@#%%%%%%%%%%%@@
// *#######*#%%%%%%#########%##%%%%#%%#-*#=#*:. ..:...*##:   :. -+.+*. .**=.=#*=  .* .+#%*:+#%#==..+*#* .=##..+*#%#%%%*%%%%%%##%%##=%@@@%@@#%%%%@%%%@%%%%
// #***#####%##%%%#*#%########%%%%#%%%#-+%####=.   :::::-::     -*:.+-:+*=..:+=:. :. .+%#=.+%#-.   .+#: :#%=  -*######*%%%%%%##%@%%##%@%%@@##%%%%@%%%%%@@
// ##*######%##%%%#########%##%%#%%%%%+-*###%#*==: +:.:..=*     -*-...=**:   :.  :-=.:*#*. *##. -.++#+. :#+. .=##%%%%##%##%%%##%@@*-#%@@@@%%%%%%@%%%%%%%@
// #########%%%%#%*###########%%%%%%%%-*#%%####+-*+#*****##=:::-+*++:-**#+...:.  -**..*#-..*#=.-#*%##- .=#:  :#%#%%%%%#%##%%%#*%@%++@@@%%@#%%#%%%%@%@@@%@
// #**######%%#%%%#########%##%%%%%%%%-#####*-...:*#%%###%%###*###*###*####**##=:*#*..+%- .*#..=*#.:.   ..  #+%%%%%#%#%#%@@%%%%%##+*#@@@@@@#%#%@%%@%%@@%%
// #*#####*#%%%%%%%######%##%%#%%%%@%#-#*=:.....:-*+#%%#=####*-:**#*%#*##*#####++%#*..-#  :##..--:::..   ...=#####%%%%%%%%%%%%%#%@*#=@@@@@%%%@%@%%@%%%@@%
// #*#######%%%%%%########%%%%%%%%%%%*-#*+==+=-=#+:.*%#+:##*#-..=##*#*#*#**##%###%#*--**..+%#=+++*++-   .===@%%#@%%%%%%%@%%%%%%%@%+*%@@@@@#%%%%%%@%@%@@@@
// #*#######%%%%%%########%%%%%%%%%%#=-#%%***+***+..-%#=.-*#+:..:++--=*=--=##%#######*+=:=##%%%#####=:=.+*##%%%#%%%%%%%%%%%#%%%@#%*-%@@@@@#%####%@%@%%@@@
// #*###%###%%#%%##########%%%%%%%%%+*-####*=+***-. -#*..:##=....==  :=.  -#########*...:-*#%%####%%%*@###%%%%%%%%%%%%%%#%@#%%%%#%*-%@@@@%%%%%#%@@@@%%@%@
// ###*#####%#%%%########%%%%%%%%%%+*#-####*:+##*-  .:...=#+:...:#-  :+:  .+##%%%##+. .*#*#%%%#%##@%%%%*%%%%#%%%%%%%%%%%#%#%##%*%#%=%@@@@@%###%@%@@@%%@@%
// ##**######%%%%#####%#%%%%%%%%%%=***#%##*:.=##* ..::...*+:.:*....  .:. .+##%###%# .-=#%##%#--##++*%%###%%%@%%%%%#+:::+#%%#@%%#@%%%@@@#%%%%#%%%@@@@@%%@%
// ##**#%###%#%%#####%###%%%%%%%**+*#-%####::=##= -==*-.:+=.:=:........ .:*#*###%*. .+##%%%%%::*+..-%#: :#%*+*#%%#+..=-*%%%%%%##%%%@@@@%##%%#@%%%@%%@%@@%
// *#**####%%####%%####%%%%%%%%%--*##-#*##-.=*#*..=##*..=#...:-... .:   =+#**#*##- .+#%###%%*:=#=..+#-  :#%: :*%+-...%+%%%%%%%#%+%*%@@@%##%%%%%%@@@%@@%@@
// ***###%%%#####%%######%%%%%%+-*###-####+:#*=*.:+#*-..+:..=*=...=*.   -%##%##*#- .*%+:::+%=.*%+..=+.  .--. .=+....+%%%%##@@%%*-%+#@@@%%%@#%%%%%@@@@%@@%
// *+*#%%%####*#%######%%%%%%%%=-###%-##%**##=*--##*%:..**--#*...:*#-.  **#**%##*: .@%-  -%#::+#-..%#:   ..  .+#....:#@@@@#@%#+#%%+#@@@@@@%%%%#@%@@%%@@@@
// **######%%#######%%##%%%%%%#=*#%##-###*=-+--+-##%##==*##*###:-*#***:+:%%%%**#*. .**-  :%#..##-..-*.      .+=#-:....-%%%%@#%==%*:#@@@@%#@#%%%%%@%%%%@@%
// **######%%##########%%%%%%%#=#####=+-+++=+#*-*########*########*#%*##*#######+.       :#+..-+:.:+-.       :#%##=....#%#%%#%+##*-*%@%@%%%@%%%%@@%@@%%@@
// ########%%#######%##%%#%%%%+=##%###+=:=+##*--#########*##**#**#%#*###%##%#*#%#+.      :%-...:..*#-.-     .**+#%#+=:.-#%@%%%#%#=-+%%%@%%%%#@@%@@@@%@%%@
// ######%%%#####%#####%%%%%%%+*######--=+##*=:*###*######%####*##%#####%%###*#%#%: :-:: -%*:....-%*:.#+    =-..*#%##. .+@%%%*#%#--#%%%@%@%%%@@@@%%@@%%@@
// *#*#%#####%########%%%%#%#**#%#%##--#%##*=:+*#####%#%%##*##%#%#*#*##%%@##*#*%###%@%%==*%#.:.:.%%*.=%#=   -....*%@-..-#@#%%**%#=+*%%@@@@%@@@#@%#%%%@@@@
// *##*##%%%%#######%%%%#####%#####*=###%#=+-=-**######*#%####*###%%###*###*#*##%@#%@@#####%%*-#@%%#+#%%:..:%##-.......-%#%%##%%-++#@@@%@%%#@%%@%%%@@%@@@
// ***####%%%#####%###%%%##%#*+#%*#*####%%*-*==+=+*++**=+###*#*####%##########*#%@%@@@%%#%%#%%%%%%%%%%%%*=#####*:....::+%%%%#+%%-*-#@%@@%@##@%%%@%#%%@@@@
// ***##*%##############%##%#=+#**######%%**=+#==+**+**=-==+##=#####%#######*##%%@%%@@%#%%%##%%%%%%%%%%##%#%###%+..--+#%%%%%+#%%**-#@@@%%@%%@#%%%%%@@@@%@
// *#**#*####%###*#%%%%%%##%#-+##%####*##%#+=+-#--+#####*#**+--##%##-=*###**##%%%#@@@%%%@@%#@#*%%##%%%%%%%%%%#%%%*%%%%%%%%%%=%%=%*-#@@@@%%@@%%%@%@@%@%@@@
// %#*+**#%########%%%%######-*######%#*+#-:=#=*-########*#%%%##+---#=+::-#%####%%%@#%%@%@##%%%#*##%*##@%%%%%@####@%%%@%##%%@%%=-*:#@%%%%%@%%%%@@@%@@@@@@
// ***+*+####%%##%###%@%#%%%*=%%##%####+-*--+#%%%%%%#%#%###%%%%%%###%+-==-:-*%==#%%%#%%%%@%%%@%%##%#%%%%%%%%#%##%%%@#@@%#%#+%%=*=+:#%@@@%%%%%%%%@@%@%@@%@
// #***+*####%#####%##%##%#%-=%%%######:+#-+%%%%%#%%#%###%%%%%%%%%%%#%###+++*%%=-+*++*****%#*#%%####%%%%%%%###%###%%@@%%%%**%%*+*-:#@@%%%%##%%%%@%%%@@@@@
// #****##%########%%#%#%%%+-*%%######==#%*%%%%%%%##%#########%###%#%#%%###%@@%##*+++*+--=*%#*+*#%#%%#%%%%%#%#####@@@%#%%***%#%%**+#+@@%%##%#%%@%%%%%@@@@
// *****##########%%%%%%#%++-###%#%##%*=%%%%%####%%%%%#%#*#%#%%####*####%%#%%%%%%%##%##**#%+----=#%%%%%%##*#@%%%%#%@@@#%*-=%%##%#%*=-%@@@%%%%#@%@@%@%@@@@
// *##**#%##########%%%####-##%####*#%=%#%%%%##%#%%%%%%**%*##%%##*##%###@%%@@%#%##%#%#%%%%##%%%%=------#-+##%##%%@%@%%@%+*%@%%%%#%**%-%%%%%%%@@%@@@%@@@@@
// +################%%%%###=%%%##%#+**+%%%%%%%%####%#*#####%%%###*##%%#%%%%@%@#%##%@###%%%##%%#%%%%%###*===--**##*#@++=+%%%#%%%%%#+#+==@%@%%%%#%@%@@@@@@@
// *#*#*###%#%##%#%%%%@%%#+#%%%%%##*++%%%#%%%%######%##%%#%%########%*+#@%@@%##%%%%%%%%@%%%%%%%%%%%%%%#%%%%#+=-=++*%%#%%%%%#%%%%@*--%#=@%%%%@@%@@@@@@@@@@
// #**##%#%%#%######%%%%%+*%####%#**#%%%%%%%%%#%###%%%##%#%%#+##%##%#++#@++#@%@%#%#@%@@%%%%%%%%%%%%%@%%%%%%#%#+*##%%###%%%%#%%%%%#+-%#=@@@%@@@@@@@@@%@@@@
// %#####%#%#%###%%%%+#=*+#%######=##%%%%%%%####%#%%%%#%%%%*-*%*=##%+#%*=-=%%##%@%%%@@%%@@%%%%@%%@#%%*%%%#*%#*+=#%%%%%%%%%%%@%%%%#=-%@#@@%#%%@@#@@@@%%@@%
// #**####%%%*#%%%%#+#%#*%%#%#%###=##%%%#%%%%%###%#%%##%%#*-=+*%%%%%#*=-----*####%%@#%%%%%%%%@%%@#%@#*#%#%%@%@%#-+%%%%%%%%%#%%%%%#*%%@%@@##%@@@@@@@@@@@@@
// %***###%%%#%%%%%%##=**%%%%#%#%#%#%@%%%%%%%%%%%%%###%%%##=#%%%##%%%%%%%%%*#*##%%@@@@%%@%%%%#%%%%%#%%#@#%@%@%%@#==#%%%%%%%%%%%%@**%%%##%%#%@@@@@@@@@@@%@
// #*#####%####%%%##%*=+###%#%%*#+%##%%%%%%%%%%%%##%%%%%%*###%%#%%%%#%%%%%%%%++*%%@@%%%%%#%%%@%%@@%%%%%%##%#%@%%%%***%%%%%#%%%%%%*+%##-#%%%%%@%@@@%@%@@@@
// ######*#%%%%%#%%#%=+%####%##==#%#%#%%%%%%%#%#%%%%%@%*#%##%###%%%%#%%@@#%%%##**%@@%%%%%#%%@%%%%%%%#*%%%%#%#%%@%%%%==%##%%%%%%%#*+%#@=%%@@@@@%@@@@@@@@@@
// *%##%%%##*@###%%#**##%%%%%%+-=%%@%%%#%%%%####%%%%%%%*#%%%#%%%%%%@%#%%%%%%%#%%%+=@%%%%%@%%#@@@@%%%%%%#%%%@@%%%%#%%%-+*+%#%%%%%%*+%%--#@%%%@@%@@@@@%@@@@
// %###%###%######%%#%*%%%%%%#+-*+*#*#%###%%#%%%%#%%%#*+%%###%%%%%%@%#%##%%%#%%#%%-@@@@%%#%%@@####%%%@%%@%%@##%#%#%%@%--+%%##%##%*+##%+@@%%%@@@@@%@@%%@%%
// ####%#%#%###%##%#*%#%%%%%#%####**#*###+*#%%@@%%%%%%##%%##%%%%%%%%%%%%%%%%%%%%%%+-%%%%@##%%@%%%%%%%%%%%%%######@%%%%@#+%%#%%##%%%%%*%@%%@#@@@@@@@@@%@@@
// %#*#%*#%%%##%%%+*%%%%%%%###*#***#########%%##%%%%%#*%###%%%%%%%%%%%%%%%%%%#%%%%%++#%%%##%%%%%%%%%%%%#%%%##%##%%%%@%@@*+%%%%%%%##%%-%@@%%%@@@@@@@@@%@@@
// ##*####%@@###%#-#%%%#%%%%+**###*######%#####*%@%#####%#%%%%%%%%%%%%#%%%%%%%%%%%%%===%%##%%%%%%%%@%%%%%%#%###%%#%@@@@@%=%%#%%%#%%%@-%@@@%@@@@@@%%%@@@@@
// %%#%%##%%#%###**%%%###%#%-##%%#####*##%#####%@%%*+*%###%%%%%%%%%%%%%%%%%%%%%%%%%%*+==#%%%@@%%%%@%%%%%%%#%@%%%%%%@@@@@@**@%%%%#%%%@-**%%@@%@%@@@@@@@@@%
// #*#%*#%%%#*%#%-%#%%%%##%#-=##%#####%%%%#@%%%%%@%%*@%%##%%%%%%%%%#%%%%%%%%%%%##%%%%*#-#%%#@@@%%%#@%@%%##%@%%%%%%@@@@@@@@==%%%%%%#%%%**%#%@@@@@@@@@@@@@@
// #*#%%@%%%%%%%*#%%#%%%%%%**#%%%##*#%@%%%#%%@%%%%#%#%%%%%%%%%%%%%%%%%%%#%%%%%%%#%#%%%%#*%%#%%@%%%%%%%%%%##%%%##%@@@@@@@@@@=%#%%%%%%%%++%@%@@@@@%@@@@%@@@
// ###%#%%%%%#%#+#%#%%#%%%%-*%####*##%%%%%%@@%%%%##%+#%%%%#%%#%%%%%%%%%%%%%%%%%%%%%%%%%%-%%%%%@%%%%@%%%##%%%%%%%@@@@@@@@@@@%=*%%%%%%%%*=%@@@@@@@@@@@@@@@@
// ####%#%%#%##**#%#%##%%%+*##%#%%##%%#%%%%#@%%#%%%*%#%%%%%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%#%%%@%%%%%%@%%%#%%%%%%#%@@@@@@@@@%@%++%%%%%%%%#+%@@@@@@@@@@@@@@@@
// ####%#%%%%##+#%%%##%#%%=*@%%###%%%%#%%@@%@@%#%%%=####%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%%%#*#%#%%%%%%#%%@#*###%%%@@@@@@@@@@@%@#*%%%#%#%%%#%%@@@@@@@@@%@@@@@
// #%%%%@##%*%###%#%%%##%**@%#%%###%%@%%@@%#%%%##@*####%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%%%@#-+%%%%%@%%%%%%%@%#%%%%%@@@@@#@%#@@@%**%%###%%%+#@-@@@@@@@%@@@@@@
// ####%%#%#-*+%%%%%%%%#%**%%%%%##%##%%%%%@%%%%@%#+*%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%%%%%#%#*%%@%%%%%#%%##%%%#%#%%%@@%@%%@@@%%@*-#%%%%%%%*#@=@@@@@@%%%%@@@@
// %#*###%%*++%%%%%%%%%%####%%####%%%%%%%%@%%#%%%#+*#%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%%%#%%%%%%@%%%%#%%%%%%%#%%@@@@@@@@%@@@@%@%=#@%%#%%%%=#-*@@@@@%@@@@@@@
// @##**#%*==%#%%%%%%#%%*+%#%%%#%##%%@%@%%@%%##%%%%%%%%%%%%#%%%%#%%%%%%%#%%%%%#%%%%%%%%%%%*#+%%%%%###%%%%%%*#%%%@@@@@@@@%@%@@@=%@%%#%%%%#=#%@@@@@@@%@@@@@
// %%##@%%%=#%###@%%%%%%**%%#%%%##%%%%#%@%@@##%%%%%%%%%%%%%#%%%%#%%#%%%%%%%%%%%%%%#%%%%%#%+*%%%%%%###%%%#%%%#%%@@@@@@%#%%%%@@%=%%%%##%%%%##+*%@@@%%@@@@@@
// %@%%###+*########%%%##%@%#%###%@@%#%%@%%#%#%%#=##%%@%%%#%%%@%%%%%%%%%%%%%%%%%#%%%%%##%%%#%=@%%#@@%@#%%%%*%@@@@@@%%%@@@@%@@@%-#+%#%#%%#%%+*-@@@@@@@@@@@
// #%#%#%#*##%%%%%%%%%%#=%%%%%%%%%%%%%%@@@@#%%%%==##%%#%%%%%%%%%%%%%@%%%%#%%%%%%#%%%#%%%%%%*-##%@%#%%#%#%##%%@@@@@@%#%@@@%%%@@@+%%%%%%%%#%%%#%#@@@@%@@@@@
// %##%%%**%%%##%%#%%%%#*%%%%%%%%%%%%@%@%%%%@%@*#=#%%%#%%%%%%%%%%%%%%%%%%#%%%%%%%#%%%%%%%%%%++=##%%#%##%%%#%@@@@@@@%%@%@@@%@@@%@%%%#%%%%#%%##@-%@@@@@@@@@
// %%#%%#+#%###%%%%%%%==%%%%##%%%%%%%@%@@@%%@%%#%#%%%%#%%%%%%%%%%%%%%%%%@#####%###%%%%%%%%%%%*++#=##%%#%%%%@@@%%@%%%%@@%@@%@@@%@=*%%%%%%%%@%%*#@@@@@@@@@@
// %#%#%-#%##%##%%%@%@-%%%%@%%@%@%@@@%%%%%%%%%=#@%%%##%%%%%%%%%%%%%%%%%%@#%#%#%%%%%#%%#%%%%%%%%+*-%#%###%@@@@@@@%@@%%%@@@@%@@@@@#=%%@#%%%#%%@+%-#@%@@@@@@
// ####%=#%###%%%%%%%%=%%%%%%@@%%%@@@@@%%%%%@@+#%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%%#%%%%%#%%####%#%%%##%%@@@@@@%@@%%@@@@@%%@@@@@#+%%@%%%%%%%%=@-%@@@@@%@@
// @##%#%#######%%#%%%%%@%%@%%%%%@%@@@%%%%%%@%%%%*%##%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%=*%#@%@%%@@@@%@@%%%@@@%%%@@@@@###%@%%%%%@%%+@-*#@@@@@@@
// %%#%+%%#%%#%%%#%%%+#%%%%%%%%%@%@@%@%%%#%@%%@%%#%%%%%%%%%%%%#%%%%%%%%#%%%%#%%%%%%%%%%%%%%%#%%##%%#*##@%@@@%%@@@@@@%@@@%@%@@@@@%%+#@%@%#%@%%%*+**@@@@@@%
// @%#+##%##%%@%%%%%%=%@%%%%%%%%%%@@@@@%@%#%@%#%%##%%%%%%#%%%%%%%%%%%%#%%%%%#%%%%%%%%%%%%#%%%%%%%%%%*#%%@@@@@@@@@%@@@@@@%%%@@@@@@#-#@#%%#%@@%%-%=#@%@@@@%
// #%#+#%#%#####%%%#*#%%%%%%%@@%@@@@%@@%%%%%%**%%%%%%%%%%%%%%%%%%%%%@%%%%%%##%%%%%%%%%%%%##%%%%#%%%%+#@#%@@@@@@@@%@@@@@@#@@@@@@@@#-#%%%%#%%%%@#@+@@@@@@@@
// %%#*%%##%#%%%%%#%+*%%%%@@%%%@%%%@@#%#%@%%%**#%%%%%%%%%%%%%%%%%%@%%%%%%%%%##%%%##%#%%@#%%#%#%###%%#@@@%%@@@@@@@@@@@@@%%%@@@@@@@%%%@%%%#%@%%%%++@@@@@@@%
// *@*=#%%%%#%##%%%##%%#%%%@%@%@%@%%@%%%%@%@%+*#%%%#%%%%%%%%%%%%%%%%%%%%%%%%#%%%%#%%%#%%%%##%%%%%%%**@@%@@@@@@@@@@@@@@@%%%@@@@@@@@##@%%%%%@%%%%%#*%@@@@@@
// #%**##%%%##%#%#%##%@@%%%%@@@@%%@%%%%#%%@%%++%%%%#%%%%%%%%%%%%%%%%%%%%%%%%#%@%%%%%%#%%%%#%%%%%%%%#*@@%%@@@@@@@@@@@@@#%@@@@@@@@@@**%@%%%%%@#%%%*:+@@@@@@
// ####%##%%%##%%%%*%#%@@%%%@@%%@%@%@@%#%%@%#+*%%%%#%%%%%%%%%%@%%%%%%%%%#%%%%%%%%%#%%%@#%%##%%%%%%%%#@@@@@@@@@@@%@@@@@@@@@@@@@@@@@*#@@%%@@%%%%%%%+-@@@@@@
// @%%%###%%*%%%%##**=-@%%%@@@@%%@@@@%%%@%%%*+%%%%%#%%%%%%%%%%@%%%@@%%%%#%%%%%%%%#%#%%%%%##%%%%%%%#=@%@@@@@@@@@@@@@@@@%%@@@@@@@@@%*#@%%%%%%#%%@#%%%@@@@@@
// @*+#%#%%%#@%%%%%%%#--#%%@@%%@%@@%%%%@%@%%**%%%%%#@%%%%%%%@%%%%%%%%%%%%%%%%#%%%%%%%%%%%@%%%@%%#%%+%@@@@@@@@@@@@@@@@#%@@@@@@@@@@@@@%%%%%%%%%%@%@%=@@@@@@
// #+*##%%%%%%%%#%#%%%=-=#@%@@%@%%%%%%@%%%%%#+%%%%%%%%%%%%%@%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#-*%%%%%%%%%%@%=%@+@@@
// ####%%%%%#%%#%##%%%#+:=#%@@@%%%#%%%%@@%@@#+%%%@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@#==%##%%@%%%%@%*#@=@@@
// %#*+#%%%%#%%%%%%%%%##+:-%%%%%#%%%%%%%%@%@#+%%%@%%%%%%%%%%#%%%%%%%%%%%%%%%%@#%%%%%%%%#%%%%%%#%%@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#-%#%%%%%%%%@%%=%-#@@
// @@@%-%#%%#%%###%%##@%#++-@@%%#@@%%%%@@%@@#+%@%@%%%#%%%%%%%%#%%%%%%%%%%%%%%%%%%@%@%%%%%%%%%@%%%%=@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@%%-%#%%%%%%%%@%%-@#*@@
// @@**=%%%%%@%%%%%%%%%@%%#=##%@%@%@@%%%@@%%*+%@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@%%%%@@@@@@@@@@@@@@@%@@@@@@@@%@@@@@@@@@@-%%%@%@%%%%%%@@-*#@@
// %@%#%=@%%@%%%%%%%%%%%%%#%-**#@**%@%#@%%@%#*%%###%%#%%%%%@%%%%%%%%%%%%%%%%%%#%%%%%%%@%%%%%%%%%%%#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%-%%%%%%%%%%%%@@+=*@@
// %%%#+*%%%@%%%%##%%%%%%%#%*+=++-++%@=++%%%##%%%%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%%%%%%%%%%%%%%%%%-@@@@@@@@@@@@@%%%@@@@@@@@@@@@@@@@@@=%%%%%%%%%#%%%@@*+@@
// #%@%#++%%@%%%%%#%%%%%%%%%%%######@@--+%%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%%%%#%%%=@@@@@@@@@@@@@%%@@@@@@@@%@@@@@@@@@@*%%%@@%%%#%%%%%@#=#@
// #%%%#%=%%%%%%%@#%%%%#%%@%%%%%@%%%%@%:-*%%####%%%%%%%%%%%%%%%%%%%%@%%@%%%#%%%%%@%%%%%@%%%#%@%%%%%@@@@@@@@@@@@@@%@@@%@@@@@@%@@@@@@@@-=%%#%@@%%%%@%%@%*+@
// %@@%#%*+#%@@@%%@%%%%%%%%%%%%%%@%%%%@%=-#%#%%%%%%%%%%%%%%%%%%@%%%%@%%@%%%%%%%%%%%%%%%%%%%%%%%%%%@%@@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@%=@%%%%%@%%%#%@%%@%++@
// %@@%%%%=+%%@@%%%%%%%%%%%%#%%%%%%%%%%%#=*#@#%@%%%%%%%%%%%%%%%@%%%%%%%%@%%%%%%%#%%%%%%%%%%#%%%%%%%*@@@@@@@@%@@%@@@@@@@@@@@@@@@@@@%*%%@%%%%@%%@#%@%%@%*#@
// *%@%%@@%==%@%@@%%%%@%%%#%%%%%%@%%%%#%#*+*#=*+%%%%%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%%%%%%%#%%%%%%#=@@@@@@@%@%%@@@@@@@@@@@@@@@@*@*##@%%%%%%%%%%#%@%%@%%*@
// #%@@%%@@%-@@@%@%%%%@%#%%%%%%%%%%%%%%%%%#=%=+#=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%#%%%%%@#=@@@@@@%@@%%@@@@@@@@@@@@@@##%=%%@@%@%@%@%%%#%%@%@%%%=%
// @%@@@@%@@%-%%%%@%%%%@%#@%%%%%#%%##%%#%%%%%+-+%%%%@%%%%%%%%%%@%@%%%%%%@%%#%%%%%%%#%@@@%%%%%%#%%%@=@@@@@@@@@@@@@@@@@@@@@@@-+@=-@%@@%@%%%%##%%#@@@%@%%@=*
// @%@@@@@%@%%+#%%%#%%%@%#%%#%%%%%%#%%#%%%%%%#-%-*%=#%%%%%%%%%%@%%%%%%%%%%%%%@%%%%%%%%%%%%%%%%%%%#%*@@@@@@@%@@@@@@@@%%-%==@@@%%%#%%%%%%%@%#%%%%%%%%%%%%=:
// @@@%@@%@@@@#=+%%@%%@%%%%@#%%%#%%##%%%%%#%%%=%-*%+##%%#%%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%%%%%@%%%%-#@@@@@%@@#@*%@@##%*+*@@@@%%%%%%%%#%%%%@%#%%%%%%%%%%@@+:
// %@@%@@@@@@@%*-=%@%%%@%%%@%%%%%%%%%%%%%##%%%=%*%#%%-%%%%%%%%%%%%%%%%%@@#%%%%%%%%%%%%%%%%%%%%%%+-*@@%##@%@*@#%*%**%%%%@@@%@%%%%%%%#@#%@%#%%%@%%%%%%@@@**
// @@%%@%@@%@@@%%-#=%%%@%%%%%@@%@%%%#%%#%%%%%%==%%%@=-%%%%%%%%%%%@%%%%%@%%%%%%%%%@%%%%%%%%%%%%@*-#@%#@@@@*=%@@+=@@%%%%%@%%%@%%%%@%%%%%%%%%@%%%%%@@%@@+##@
// %%@@%@@%#@%%@@#@+*#%%%%%%%%@%@%%@%%%@##%%%%%#%%%%@:=%%%%%%%%%%%%%%@%%%%%%@%#%@@%%%%%%%%%%%%#-*%@@%==------%%@@%@%%%@%%%%#%%%#%%%%%%%%%%%%@@%@@%@@*-*@@
// #@@@%@@@%%%@@%@=##+%%%%%%%%%%%@%%%%%%%%%%@%#%%@%%@-=%%%%%%%%%%@%%%@%%%%%%@%%@%%%@%%%%@%%%%#-++=++*+==+@%@%%%%%%%%%%%%%%%%##%%%%%%#%#%@%%@@%@@#+#%@*@@@
// #%%@@@@@@@@%@@@@+++@%%%%%@%%%%%%%%#%%%%%%%%%%%@@#*+=#%%%%%%%%%%%%%%%%%%%%@%%%*#%%%#%%@%%%%+=%%%%%%%@@@%%%%%%%@%%%%%%%%%%%%%%%%%%%%%%%%%%@%@@%+*%@@@@@@
// %%%%@@%@@@@@@@@@%==%@%%%%%%%%@%%%%%%%%%%%%%%#%@@+*+#%%@%%%%%@%%%%%%%%%%%@@%%=+#%#+%%%%%%%%-#%%%%%@%@@%%%##%%%%%@%%%@%%%%%%#%%%%%%%%%%%%@%%@%=+*@@@@@@@
// %%%%%%%@@@@@@@@@@%=%@%%@%%@%@%%%%%@%%%%#%%###%%@=%=@*#%%%%%%@%*#%##%%%%%%+===%%%=#%%%#--+=#%%%%%%@@@%%%%%%%%%%@%%%%%%%%%%%%%%@%%%%@%@@%%%@%%-+@@@@@@@@
// @%@@@@@@%%@@@@@@@@@*@@%%%%%%%%%%@%#@%%%%%%%%%@@%=%-#**-+%%@%%%+#%#%%%###+---%%%-=%%#-%%%=#%%%%%@@%@%%%%%@#%%%@%##%%%%%#@%%%%%%@#%%%%%@%-%*#@=@@@@@@@@@
// #@%%@@@@@@@@@@@@@@@+-#@%%@%%%%#%%%#%%%%%#%%%%%@@==-=+*+#%@%#%#-*##%#%%#+++*%%#+-#%%+*##*%%%%%%@@@%%%%%%@%%%%%%#%%%%%%%@@%%%%%@%%%%@%%#-=*#@@%@@@@@@@@@
// #%%%@@@%%@@@@@@@@@@@+=*%@%%%%%#%%%#%%%%%#%%%@%%@*%-=*-%-#%@+%#+#+#%%%%+=*#%*##+-+##+++#@%%%%%%@@%%%@@%%%%%%%%%%%%%%%%%%%%%%%%%%%@@%@%=-%#@@@@@@@@@@@@@
// %%@%@%@%@@@@@@@@@@@@@##+@@%%%%#%%%%%%%%%#%%#%%%@%@-+#*+-=#@%@*##=#%%%+-+*%+--+**%=-+==#%%%%%%@@%%%%@%%%%%#%%%%%%%%%%%%%%%%%%%%%%%@%%*-#@@@@@@@@@@@@@@@
// @@@@@@@%@@@@@@@@@@@@@@@%=%@%%%%#%#%%@#%%#%@%%@%@%=-==%%-*-%@=##=#%*--##+%=.+=*=--..::-@%@@%%@%@%%@@%%%%%%%%%@%%%%%%%%%%%@%%%#%%@@@%#*%@@@@@@@@@@@@@@@@
// %@@@%@@@%@@@%@@@@@@@@@@@@#+@@%%%%%%%%%%#%#%%%@%%%@--=#*-=++%-%%*#%%+*---=*+**. .*. :*@=%@%%%@%%#%@%%%%#%%@%%@%%%%%%%%%%@@%%#%%@#=-@%@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@%*@+%%#%%%%%%%@#%##@%***::=*#*#+*--*+#@@%*==+:- = . :+.:-*=#*%%%%%@@%%%%%%%%%%@%%@%%%%%%%@%%%@%%%%@%#+=%@@@@@@@@@@@@@@@@@@@@
// @@@@@%@@@@@@@@@@@@@@@@@@@@@#%#*%%%#%%%%%#####@%#+-=:=*:*+=+-=#*%%%*#++ :-. -:.-..-:=%=@%%%%@@%%%%%%%%%%%%@%@%%%%%%%%%%%%%%%@@**=+@@@@@@@@@@@@@@@@@@@@@
// %@@@@@@@@@@@@@@@@@@@@@@@@@@@@##%%%%%%%%###%##%%@%=%:+=-**-=-:=*#%++-: ... +:.==.-=:-+=%%%%%@@%%%%@%%%#%@%%%%%%%%@%#%%%%%%%@@++*+@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@%@@@@@@@@%@@@@%%#%#%%#%%####@%*+-#--+=.--=...:--*+:-..:=*:-:-:::-=*-#@%%@%@%%%@%%%%%%%%%%%@%@%@%%%%%%%@%%---=@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@+%##%%%##%#%##%%*.-%..*.::-. -#-=@.:--=.-+--.-:.:=-#=%%%%%@@%@%@%#%%%%%%%%@@%@%@@%%%%%%%+-#==@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=@%%%%%%%%##%#%##=:* .- -.::=#*-- :-*-.*-:= -.::#*:#=**@%%%%%%%%%%%%%@%%%@@%%@%%%%@%##+=#-=#@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%=%%#%%%@%%#%%%%##-:..:+.:.:=:==-.::*=+:-::. .  :-.=%**%@%@%%%%%%%%%%@@%%%@@%%%%@%###-*=**#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@%@@@@@@%@@@%=%@%#%%%%%#%%#%%%-...... -=:++:+--=::.=---:.- ..: =**@@@%@@@%%%%@@%%@%%@@@%%@@@+%%+%-*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@%%@@@@@@@@@@@@@@@@@@@@@@=#@%%%%@%##%%%%#+:.- .  .++-==:-+#:  .#:...# .=:.%%=*%@%%%%%%%%%@%@%%%@@@=----@----@%@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@
// %@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@=%@%%@%%%#%#%%%#--#-    *+:*-.=+. :...-:.:*.:+:.-*=:#%@@%%%%%%@@%%@%#%+*#@@#*@==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=%%@%%%%%%%#%%@#-=+:. .:-##=.::.=.:-::. =*=:...:-+=-#@@@%%%%@@%@%%%#+%#@*+*+=%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@%@@@%@@@@@@@*@%%%%%%%%%%%%@**%-   ===+*-=+=+=-+-..-=+*:.:-:-*%=##%@@%%%%@@@%%%**@@#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%@%%%%%#@-*@.+=.=*=-#+#=.-=.-:=*:-::.+.#--+=#@@%@@@%@%%%%%%%*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@#%%%%%%@%%%%@@@*#= %:-.++*+=%.#%--%%+#+=%%%@%%@@@-@@@@@%@@%@%%%@@+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/Metti For Roe v. Wade.sol

// ####%#####*###**####%##%#########%#*###*+**###%%######%######*##*#**###########*#########%#######################*####%######%%#%%#%%%%%%%%%%%%%@@%%@%
// ################%#####*#**#*##*#*#*#*##*##**#*##*##*##*#**#*##########**#######*###################*##*#*##############%*%####%%%%%%%%%%%%%%%%%@@@@@@@
// #####################***#**#######*###########*==*#*#*######**####*###*##############**##*###**#######***####%###########%#####%%%%%%%%%%%%%%%%%%%@%@@
// *##**####*##+**##################-*#########-+*++*#*########**##*#################*######*###**##################%#####%#%%##%%%#%#%%%%%%%%%%@@%%%%%%%
// ***#######*:*:*#####%####*####.#++######*+=#########*############*#######*######*#**##*#######################%####%###%*##%####%%%%%%%%%%%%%%%%%@%%%@
// ########**-*#-*######*######## =-+#####.+####################**###****#######**######################*##*####%############%%%%##%%%%%%%%%%%@%%%%@%%%@%
// ########:*##**####*-#=+#+##*+-:#**++*=*########################**######*####**######%##################*#########%%###%##%##%%%%%%%%%%%%%%%%%%%%%@%%%%
// *#*####+=*#*-*##-+---:+--+=-=-=*=-==#########################*#############*###*#########*#######***########################%#%%%%%%%%%%%%@%%%%%%%@%@%
// ****#%*.+#*---*-.===+.++**+*#+=-**###########################**#**#########*##################*####*##############%#########%%%%%%%%%%%%%%%%%%%%%%%@@%
// ##*##*:**#:***#***:*#*######+.#########*##############*####**#############**######%############**#######*####%####%####%#####%%%#%%#%%%%%%%%%%%@%%@@@%
// ###*#*+=*:######*+-*###*#*+:*##*###*##########*#########################*##########*#############**%########%####################%#%%%%%#%%%%%%%%@@@@@
// #####-*=-#######+-**#*#*=-+#*##*##########***#################**###########################*##############%#########%%%#####%#%%%%%%#%%%%%%%%%%%%%@%@@
// #*##=#=+*######**-+***++=**#***####*******##*#####**#####***#####*################**########**#######*##**###%############%#%#%%#%%%##%%%%%%%%%@%%%%%@
// ####+#+####*##******+-*****###*#***#*##*##########*###*##*#####*########**#######**########**###****####**#######%##*###%%###%%#%#%#%%#%%%%%%%%%%@%%%%
// **#-#:###*#*#*#+ =*.**#*##***#***#*#*#****#**#####*#*#*#####*########*#*#######*###**+*##***#*####***#*#*###*###############%%#%###%%%%%%%%%%%%%%%%%%%
// ###=*=###*#*****:*-*****#**##*#*#*#**##*#####*###*#***##****################*+++*++**+**#****##**##*###########%#*#####%###%#%###%#%%%%%%%%%%#%%%%%%%%
// *#+*-*##*#%#**#*.=*#*##*##***#*#**##****###########*#########***####*#*#***+++**##*******##*##*####*####*############%##%####%##%%#%%%%%%%%%%%%%%%%%%%
// ##++=*######*#=:+###********++***##****#%*####******#########*#####*******#***######*+*##*#**#*####*#*##############%%#######%##%%%%%%#%%%%##%%%%@%@%%
// %+=-*###%#***=+**#*##**********#**#***#######******##########*###***#*###**#*****#*##+###*########**####*####################%###%%%%%%%##%#%%%%%%%%%%
// #*+##++#***=-#+****#+#**#*##*###**##*###*##**#****#*###***###*#####**+%#+******+##**#*#*###*#*#****#**####%####%%###########%####%%%%%%%%#%#%%%%%%@%%%
// *+=+#****#####***###+**+***#*###*%#**#####*******###**#####***#*##*###*+*+***+++******#*####*********#########%###%########%%###%%%%#%%%%%%%#%%%%%%%%%
// *-+######*#**###*#*#****####*#**##***#####*********#####**##***#*#**#***********#**********#*****##################%######%%%*###%%%%%%%%%%%%%%%%%%%%%
// ***#####*######%##*###*#*#*#####****#####******##**##*##***##***#***#***##******+*******####******##*###############%####%%%%*%%%%%%%%%#%%%%%%%%%%%%%%
// #*####%########*####*+*************######*****#######**********#*#******%#*#***++****+**###*+**#*###*###%###################%##%%%%%%#%##%%%%#%%%%%%%%
// *#####*****#**#++*#*****###*#*****#####******######*##**********#****%****+#**********#*###*##***#*##*##################%###%%%%%%#%%%%%##%%%%%%%%%%%%
// #****##**####**####*+**##**#***#**##%#****#*#**#**#*###**#*#*****#*#**####**********#######*##**########%######%###%######%#####%%%##%%%%%##%%%%%%%%%%
// ***######*###*#####**#**#*#******####*********####****####*##*########******#******#**#########*###*###%%#####%###%##%%#%#%##%###%%#%###%%%%%%%%%%%%%%
// #*****######**#****#*****##****###******#*#*##*#*******#**###########**###*#**#*****#####**#############%#%%%%##%%######%%###%%##%%##%%%%%%##%#%%%%%%%
// #####*#*****##****++****##*#*#*#####******#**#********##*#####*#####**######**#****##***###%%###***#####%#################%###%%###%%#%%%%##%%%%%%%%%%
// #**#**#******###****+*%#*****######*****#******#*#***#####*#**#*#%#######**%*#*#*#*#%#####%######****#%%#%%############%####%%%%#######%###%#%%%%%%%%%
// #**#*####**###*##*+*%*###**######***#####****#****##**#***#######**#******##***####*###################%##%##%%#%##%%%#######%##%%#%%%#%###%%%%%%%#%%%
// ***###****#***#****#%#############****#**=***##********#**#**#*******#******#*##*##*##########################%%##########%##%###%#%%%##%##%%%%%%%%%%%
// ****#***###****#****#***##**#*##*###*#***=***#*===**#*##**##*********#******####*###########**###%#%########%######%#####%%%########%##%%%%%##%%#%#%%%
// #**##*#####**###*****+**#######***#**#*#*=+=-=*+*--=*###**#**********#*###***##############%###*%%%#%%#%###%#####%%###%###%%%#*#######%##%%%###%#%%%%%
// ####*#*#*###*#************#*###########**=******=-------+#*-::+**#*#*####**####%##%%########*#%####%###############*#####%%######*##%%#%###%##%%%%%%%%
// *##*******#***#***+*#****######***####******#*****###*#*#+-----=***+**++++****######*###########%##%#%%#####%##%########%%%%##%##########%%%####%%%%%%
// **#****#****##***#******###**#**#####*##***************######*+====++==-:-==+###+++++#####%%####%###%###%%%#########%#%%##%#%##%#####%%%%#%###%#%%%%%#
// *####*####*******#*#*****###***###*#####=+***#*****+=:-#*##############*+*+=====::::-+###++====#########%%##########%%##%%#########%###%%####*#%%%%%%%
// *##########**##*****###*##**####***###**-=##*******+...###*##*###*:=####*#******#+::=*###-*****-=###%##%######%####%####%%#########%####%###%#%#%%%%%%
// ##**#***##********#**########*#*###*****-=*###*:..*=...###+######   +*#**######%##%%%*------:-:-=##%#######%%%%####%%%%%%%########*#%##########%%%#%%%
// #****#####*%#****##*###*####%##****#*#*#=+##**=...:....+##:..:+*.  .+####*#######%%%%###%##*=====++******####%##%%%#####%################%#####%%%%%#%
// ***##**##*#*###*#**#######%%##*****#**#+******-...:....#*#=..:--. .=#######+*##%%%%%%####*#%#####*++-+===##+++########%#%##########*###%#%###%%%%%%%%%
// #***##*******#**#***#%%%%%%###**#*****#-=**#**.........=***+++-   :*###*##=-+##%%%%#*#+--:*###*#####**==+###+-=+%%%#####%#########*###%%#####%%#%#%%%%
// **###**#**##***#**##*#%%%%###***#*#****-+****-::.......=******-  .*######*:.+##%::=-...  .:##*:###+:::-*#%%%###*----=*%#=+-*#%################%%%#%%%@
// *#*##*#**###*##*****%%%%%#*#####***###*--*###..:........*****#=  .#**####+.:+%%. .-..   :.=:...:*-... -*#*#%%#%%##%##=-----*##%#*%#*+#%##**#####%%%%%%
// *#####*#*+**********%%%##########*****#*=***=.:=.......-##**#*- :+#***#***::*%#. .===  .*=.:::+=+.:-:  :###%%%%#**#%###*#%#####*#==*########%#%##%#%%%
// *********+***######*%%%###**#####*#****=+***-:=*:...:...+#**#+ .+##**#*##+.-##%. .+#+. :*+.:=**#*.-#*  -**+*%%%= =#%#+-:*###%*#####*##%%####%#%###%#%@
// **********#################*##****#*##*-=***==**:..:=:..-**#*- -*##****%%=.*#%%. :*#+  -#+.:*###=. =-  :*==+%%#: +##*:..#%%%##%#######%#####%%#%##%%@@
// *###*####**##****#%#%##**###*****#***#*--*=-=***:..:+*...=##*. -*****####-.+##*. -##*  -#:..:..-* :#. .=*--*#%#. .#:.. *#####%%%#%=%%########%%%#%#%%%
// ##******+**#*########%###****###*#*****--*=:++++-...+*+..:+*+  +*****%%%+. :##=. -%#.  =#..   .#: -:.:***-=##%#  **    *###**#**####%%%#####%%%#%#%%@%
// *#%#######%##*#####%%#****####**##*#**=#**++=#**+::=##*::=##. .+*+**###%*: -##-..*%%-..=*:..--##    .=###=:*%%*..=#.....-*####*##+*=#%%%%#########%%%%
// ###**##***##############******#*##**##++###*################-.=**++*####+. :#*: .+##. =#*..-%%## . -=####-:*#%: .=*=+=:. .=*#####+%*%%#%%%###%##*#%%@%
// **#*#*##############*####*#########*#+*+##########*****#####*++***#######- .%=. :##=..*#=..*##*=   :##*#%..=%#...+%%%#*+. -*######%#%#%%%%######*%%%%%
// #######*####*#*#%######**####*#######+-*##*####*###*##*#%###*****##%#####- ... .###- .+#-..+-:..    .:-#%..:*+ .=#%:%%#%+ .=####+#==##%#%#####***#%%%%
// *##*#****###*####%##*#####**#########+-*###****###**-.+#**###*****####%###:...:*#%##.=#%-..::... -*.   :*-....  --:....   .+%#*#=+-+###@##%##*#%#%%@@%
// *#**#################**############**==*##*#*#*#+-::..+****#*+****###%####-:=-**+*##-#%%+*-*++-  -*-.  -##-.. :-++..      -*####%#-+%#%%##%%%@@%*#%%@%
// *#*################*#*#############*#+**#####*##**++-=******+--*#########=. .=+. :+#%#*+-=#*###..+##+=-+##*=-:####+: .  .:=#*#%#%%=*#%%%%%%%%@%@#%%%%@
// ***#################################*-+#*#########+=+*+##*+=::=#########%+. ...  :#%#::   -=#**==*###%##*+=+#+#%%##*:=:-=**#%%#***###%%%%%#%%%@%%%%%%%
// ***#####**##########################*:+*##%%#*####--+#**.....-*######%##+:  ..   .=*- .    :#####+#%#***:..=###%####*####%####*##-*%%%##%%%@@%@%@@%%%@
// #*##################################*-+#%###@#%#%%:=*##*.   .+##%###%##*..  ..  .-*#. .=+. .+=-%#==##==+-+:*###%%###*%#%###*##*##*=#%%%%%%%@@%%@%%@%%@
// ################*##################%*-*#######%%#=-=###*-:....-*#######+:       .-*=..=##- .=:.##==%#+=*+*###%#%%#*%%##%#%%#%###+*##%%%%%%%%%%%%%%%%%@
// #############################%######*+##%#*#####*..=+***##+=-..+###%%%#-      .. -*+.:#*#+. ::.*=-+#*+-*+####%%###*%#%%##%##**##+++##%%%###%%%@%%%%%@@
// #####################%#######%######*+####*###+-=....::::--+-. +#%%%#%-:..    :..=*+.-#*#.  .. :.:*#*-:-:-+##*%#####%%#*#%%##+##+=-#%%#%#%#%%%%%%@%%@@
// ####################%####%####%###*#*+###%%%##+=-.... ...  ..  +#%%##%. .=.  -+..-**.:==.  :=  .:+##*.....=####%###%#%%%##*##%%#=#-#@%%%@#%##%%@%%%%%@
// ####%###############################*-*%%###*####*+*:+:*.. ...=##%%##-.:+=. .=*-  :+: .   :*.  :=#%#...=:=**#*#%*#%%#%#****#*#%#=+%#%@%@%%#%%%@%%@%%@@
// #####################%##############+-*%%#*+=***###**#**+=:+*=#%%%%%%::+#*:-+**#.. -.  ..:#=..=.:=#%: :+++%%###*#%#%%#***#**####*=#%%%#@@#%%%%%%%%%%%@
// ###################%%#%#####%#######-=*##*+##*-+#***+==***+###%%%%%%#*+###+##***+=-+===++*#- :*-::==. . ..+##*%#%%#%%#*##*##%###*#*%%@%%@%%%@%%%%%%%%%
// **################%%%#############%*-+#%#=:*#%+=*+--:..*#*-=#%%%%%########**###*#*#%**####%+-+**:. ....  .-####%#%%%%**##+*#%###+=+@@@%@%##%%%%%%@@%%%
// *################%%#############%#%#:+%#*=-*%*.-*-=:::+*==..*%%%#%#%%#%#++*#####++#%#%#####%##%%#+-..#*****#*#%@%%%%%**%@%##%##%==#%#%%@@%#@%#%@@@%%%%
// ################%%%%%########%%%##%#:+##+.-*-..=##=***#*- .#%#%#-%#- =%*==%####- -#%#%*#*+*-###%%######%%**#%%#%%%%%%%#%%%####@%==#%%@@%#%%%%%%@@%%%%%
// ###############%%%##%######%%%%%%%%*:+%*.:-. ..=#*++++**=:+%%##+-%*..-##==*###+. .=##*==:..-%%*+:=##*+*+###*#%%##%%%%###*%##%%##=%-%%%@@%%%%%%%%@%%%@@
// ##**##########%#%%#########%%%%%#%%#:+*-..  .-+##+:.::*-:=%%+#%==#- .###+=#**+:  .-#-=..:.:-+=:...+%+=::=###%#%+###%%#*%*###%%#%*+*#%%@@#%%%%%%%@%%%%@
// #############%%##%#%#######%%%%%%#%#-+-..=..+*%##:..:=#: .*=.=+:-#- .+##+:+**=  +.:*-**++**+......+#-:-:.++#%#*#%#%#%########@%%#-@#%%@@#%%%%%%%@%%@@@
// *#######*#%%#%%%%###%#####%%%%%%%%%#-++.+-..*#%##..=#%+. .+. -+:**:  ***-:+##=  ...+%#*==%%*..=-####..=*-.:*%*#%###*#*#%%##%#%@#--%@@%@@#%%%%%%%%%%%@@
// *#######*#%%%%%%#########%##%%%%#%%#-*#=#*:. ..:...*##:   :. -+.+*. .**=.=#*=  .* .+#%*:+#%#==..+*#* .=##..+*#%#%%%*%%%%%%##%%##=%@@@%@@#%%%%@%%%@%%%%
// #***#####%##%%%#*#%########%%%%#%%%#-+%####=.   :::::-::     -*:.+-:+*=..:+=:. :. .+%#=.+%#-.   .+#: :#%=  -*######*%%%%%%##%@%%##%@%%@@##%%%%@%%%%%@@
// ##*######%##%%%#########%##%%#%%%%%+-*###%#*==: +:.:..=*     -*-...=**:   :.  :-=.:*#*. *##. -.++#+. :#+. .=##%%%%##%##%%%##%@@*-#%@@@@%%%%%%@%%%%%%%@
// #########%%%%#%*###########%%%%%%%%-*#%%####+-*+#*****##=:::-+*++:-**#+...:.  -**..*#-..*#=.-#*%##- .=#:  :#%#%%%%%#%##%%%#*%@%++@@@%%@#%%#%%%%@%@@@%@
// #**######%%#%%%#########%##%%%%%%%%-#####*-...:*#%%###%%###*###*###*####**##=:*#*..+%- .*#..=*#.:.   ..  #+%%%%%#%#%#%@@%%%%%##+*#@@@@@@#%#%@%%@%%@@%%
// #*#####*#%%%%%%%######%##%%#%%%%@%#-#*=:.....:-*+#%%#=####*-:**#*%#*##*#####++%#*..-#  :##..--:::..   ...=#####%%%%%%%%%%%%%#%@*#=@@@@@%%%@%@%%@%%%@@%
// #*#######%%%%%%########%%%%%%%%%%%*-#*+==+=-=#+:.*%#+:##*#-..=##*#*#*#**##%###%#*--**..+%#=+++*++-   .===@%%#@%%%%%%%@%%%%%%%@%+*%@@@@@#%%%%%%@%@%@@@@
// #*#######%%%%%%########%%%%%%%%%%#=-#%%***+***+..-%#=.-*#+:..:++--=*=--=##%#######*+=:=##%%%#####=:=.+*##%%%#%%%%%%%%%%%#%%%@#%*-%@@@@@#%####%@%@%%@@@
// #*###%###%%#%%##########%%%%%%%%%+*-####*=+***-. -#*..:##=....==  :=.  -#########*...:-*#%%####%%%*@###%%%%%%%%%%%%%%#%@#%%%%#%*-%@@@@%%%%%#%@@@@%%@%@
// ###*#####%#%%%########%%%%%%%%%%+*#-####*:+##*-  .:...=#+:...:#-  :+:  .+##%%%##+. .*#*#%%%#%##@%%%%*%%%%#%%%%%%%%%%%#%#%##%*%#%=%@@@@@%###%@%@@@%%@@%
// ##**######%%%%#####%#%%%%%%%%%%=***#%##*:.=##* ..::...*+:.:*....  .:. .+##%###%# .-=#%##%#--##++*%%###%%%@%%%%%#+:::+#%%#@%%#@%%%@@@#%%%%#%%%@@@@@%%@%
// ##**#%###%#%%#####%###%%%%%%%**+*#-%####::=##= -==*-.:+=.:=:........ .:*#*###%*. .+##%%%%%::*+..-%#: :#%*+*#%%#+..=-*%%%%%%##%%%@@@@%##%%#@%%%@%%@%@@%
// *#**####%%####%%####%%%%%%%%%--*##-#*##-.=*#*..=##*..=#...:-... .:   =+#**#*##- .+#%###%%*:=#=..+#-  :#%: :*%+-...%+%%%%%%%#%+%*%@@@%##%%%%%%@@@%@@%@@
// ***###%%%#####%%######%%%%%%+-*###-####+:#*=*.:+#*-..+:..=*=...=*.   -%##%##*#- .*%+:::+%=.*%+..=+.  .--. .=+....+%%%%##@@%%*-%+#@@@%%%@#%%%%%@@@@%@@%
// *+*#%%%####*#%######%%%%%%%%=-###%-##%**##=*--##*%:..**--#*...:*#-.  **#**%##*: .@%-  -%#::+#-..%#:   ..  .+#....:#@@@@#@%#+#%%+#@@@@@@%%%%#@%@@%%@@@@
// **######%%#######%%##%%%%%%#=*#%##-###*=-+--+-##%##==*##*###:-*#***:+:%%%%**#*. .**-  :%#..##-..-*.      .+=#-:....-%%%%@#%==%*:#@@@@%#@#%%%%%@%%%%@@%
// **######%%##########%%%%%%%#=#####=+-+++=+#*-*########*########*#%*##*#######+.       :#+..-+:.:+-.       :#%##=....#%#%%#%+##*-*%@%@%%%@%%%%@@%@@%%@@
// ########%%#######%##%%#%%%%+=##%###+=:=+##*--#########*##**#**#%#*###%##%#*#%#+.      :%-...:..*#-.-     .**+#%#+=:.-#%@%%%#%#=-+%%%@%%%%#@@%@@@@%@%%@
// ######%%%#####%#####%%%%%%%+*######--=+##*=:*###*######%####*##%#####%%###*#%#%: :-:: -%*:....-%*:.#+    =-..*#%##. .+@%%%*#%#--#%%%@%@%%%@@@@%%@@%%@@
// *#*#%#####%########%%%%#%#**#%#%##--#%##*=:+*#####%#%%##*##%#%#*#*##%%@##*#*%###%@%%==*%#.:.:.%%*.=%#=   -....*%@-..-#@#%%**%#=+*%%@@@@%@@@#@%#%%%@@@@
// *##*##%%%%#######%%%%#####%#####*=###%#=+-=-**######*#%####*###%%###*###*#*##%@#%@@#####%%*-#@%%#+#%%:..:%##-.......-%#%%##%%-++#@@@%@%%#@%%@%%%@@%@@@
// ***####%%%#####%###%%%##%#*+#%*#*####%%*-*==+=+*++**=+###*#*####%##########*#%@%@@@%%#%%#%%%%%%%%%%%%*=#####*:....::+%%%%#+%%-*-#@%@@%@##@%%%@%#%%@@@@
// ***##*%##############%##%#=+#**######%%**=+#==+**+**=-==+##=#####%#######*##%%@%%@@%#%%%##%%%%%%%%%%##%#%###%+..--+#%%%%%+#%%**-#@@@%%@%%@#%%%%%@@@@%@
// *#**#*####%###*#%%%%%%##%#-+##%####*##%#+=+-#--+#####*#**+--##%##-=*###**##%%%#@@@%%%@@%#@#*%%##%%%%%%%%%%#%%%*%%%%%%%%%%=%%=%*-#@@@@%%@@%%%@%@@%@%@@@
// %#*+**#%########%%%%######-*######%#*+#-:=#=*-########*#%%%##+---#=+::-#%####%%%@#%%@%@##%%%#*##%*##@%%%%%@####@%%%@%##%%@%%=-*:#@%%%%%@%%%%@@@%@@@@@@
// ***+*+####%%##%###%@%#%%%*=%%##%####+-*--+#%%%%%%#%#%###%%%%%%###%+-==-:-*%==#%%%#%%%%@%%%@%%##%#%%%%%%%%#%##%%%@#@@%#%#+%%=*=+:#%@@@%%%%%%%%@@%@%@@%@
// #***+*####%#####%##%##%#%-=%%%######:+#-+%%%%%#%%#%###%%%%%%%%%%%#%###+++*%%=-+*++*****%#*#%%####%%%%%%%###%###%%@@%%%%**%%*+*-:#@@%%%%##%%%%@%%%@@@@@
// #****##%########%%#%#%%%+-*%%######==#%*%%%%%%%##%#########%###%#%#%%###%@@%##*+++*+--=*%#*+*#%#%%#%%%%%#%#####@@@%#%%***%#%%**+#+@@%%##%#%%@%%%%%@@@@
// *****##########%%%%%%#%++-###%#%##%*=%%%%%####%%%%%#%#*#%#%%####*####%%#%%%%%%%##%##**#%+----=#%%%%%%##*#@%%%%#%@@@#%*-=%%##%#%*=-%@@@%%%%#@%@@%@%@@@@
// *##**#%##########%%%####-##%####*#%=%#%%%%##%#%%%%%%**%*##%%##*##%###@%%@@%#%##%#%#%%%%##%%%%=------#-+##%##%%@%@%%@%+*%@%%%%#%**%-%%%%%%%@@%@@@%@@@@@
// +################%%%%###=%%%##%#+**+%%%%%%%%####%#*#####%%%###*##%%#%%%%@%@#%##%@###%%%##%%#%%%%%###*===--**##*#@++=+%%%#%%%%%#+#+==@%@%%%%#%@%@@@@@@@
// *#*#*###%#%##%#%%%%@%%#+#%%%%%##*++%%%#%%%%######%##%%#%%########%*+#@%@@%##%%%%%%%%@%%%%%%%%%%%%%%#%%%%#+=-=++*%%#%%%%%#%%%%@*--%#=@%%%%@@%@@@@@@@@@@
// #**##%#%%#%######%%%%%+*%####%#**#%%%%%%%%%#%###%%%##%#%%#+##%##%#++#@++#@%@%#%#@%@@%%%%%%%%%%%%%@%%%%%%#%#+*##%%###%%%%#%%%%%#+-%#=@@@%@@@@@@@@@%@@@@
// %#####%#%#%###%%%%+#=*+#%######=##%%%%%%%####%#%%%%#%%%%*-*%*=##%+#%*=-=%%##%@%%%@@%%@@%%%%@%%@#%%*%%%#*%#*+=#%%%%%%%%%%%@%%%%#=-%@#@@%#%%@@#@@@@%%@@%
// #**####%%%*#%%%%#+#%#*%%#%#%###=##%%%#%%%%%###%#%%##%%#*-=+*%%%%%#*=-----*####%%@#%%%%%%%%@%%@#%@#*#%#%%@%@%#-+%%%%%%%%%#%%%%%#*%%@%@@##%@@@@@@@@@@@@@
// %***###%%%#%%%%%%##=**%%%%#%#%#%#%@%%%%%%%%%%%%%###%%%##=#%%%##%%%%%%%%%*#*##%%@@@@%%@%%%%#%%%%%#%%#@#%@%@%%@#==#%%%%%%%%%%%%@**%%%##%%#%@@@@@@@@@@@%@
// #*#####%####%%%##%*=+###%#%%*#+%##%%%%%%%%%%%%##%%%%%%*###%%#%%%%#%%%%%%%%++*%%@@%%%%%#%%%@%%@@%%%%%%##%#%@%%%%***%%%%%#%%%%%%*+%##-#%%%%%@%@@@%@%@@@@
// ######*#%%%%%#%%#%=+%####%##==#%#%#%%%%%%%#%#%%%%%@%*#%##%###%%%%#%%@@#%%%##**%@@%%%%%#%%@%%%%%%%#*%%%%#%#%%@%%%%==%##%%%%%%%#*+%#@=%%@@@@@%@@@@@@@@@@
// *%##%%%##*@###%%#**##%%%%%%+-=%%@%%%#%%%%####%%%%%%%*#%%%#%%%%%%@%#%%%%%%%#%%%+=@%%%%%@%%#@@@@%%%%%%#%%%@@%%%%#%%%-+*+%#%%%%%%*+%%--#@%%%@@%@@@@@%@@@@
// %###%###%######%%#%*%%%%%%#+-*+*#*#%###%%#%%%%#%%%#*+%%###%%%%%%@%#%##%%%#%%#%%-@@@@%%#%%@@####%%%@%%@%%@##%#%#%%@%--+%%##%##%*+##%+@@%%%@@@@@%@@%%@%%
// ####%#%#%###%##%#*%#%%%%%#%####**#*###+*#%%@@%%%%%%##%%##%%%%%%%%%%%%%%%%%%%%%%+-%%%%@##%%@%%%%%%%%%%%%%######@%%%%@#+%%#%%##%%%%%*%@%%@#@@@@@@@@@%@@@
// %#*#%*#%%%##%%%+*%%%%%%%###*#***#########%%##%%%%%#*%###%%%%%%%%%%%%%%%%%%#%%%%%++#%%%##%%%%%%%%%%%%#%%%##%##%%%%@%@@*+%%%%%%%##%%-%@@%%%@@@@@@@@@%@@@
// ##*####%@@###%#-#%%%#%%%%+**###*######%#####*%@%#####%#%%%%%%%%%%%%#%%%%%%%%%%%%%===%%##%%%%%%%%@%%%%%%#%###%%#%@@@@@%=%%#%%%#%%%@-%@@@%@@@@@@%%%@@@@@
// %%#%%##%%#%###**%%%###%#%-##%%#####*##%#####%@%%*+*%###%%%%%%%%%%%%%%%%%%%%%%%%%%*+==#%%%@@%%%%@%%%%%%%#%@%%%%%%@@@@@@**@%%%%#%%%@-**%%@@%@%@@@@@@@@@%
// #*#%*#%%%#*%#%-%#%%%%##%#-=##%#####%%%%#@%%%%%@%%*@%%##%%%%%%%%%#%%%%%%%%%%%##%%%%*#-#%%#@@@%%%#@%@%%##%@%%%%%%@@@@@@@@==%%%%%%#%%%**%#%@@@@@@@@@@@@@@
// #*#%%@%%%%%%%*#%%#%%%%%%**#%%%##*#%@%%%#%%@%%%%#%#%%%%%%%%%%%%%%%%%%%#%%%%%%%#%#%%%%#*%%#%%@%%%%%%%%%%##%%%##%@@@@@@@@@@=%#%%%%%%%%++%@%@@@@@%@@@@%@@@
// ###%#%%%%%#%#+#%#%%#%%%%-*%####*##%%%%%%@@%%%%##%+#%%%%#%%#%%%%%%%%%%%%%%%%%%%%%%%%%%-%%%%%@%%%%@%%%##%%%%%%%@@@@@@@@@@@%=*%%%%%%%%*=%@@@@@@@@@@@@@@@@
// ####%#%%#%##**#%#%##%%%+*##%#%%##%%#%%%%#@%%#%%%*%#%%%%%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%#%%%@%%%%%%@%%%#%%%%%%#%@@@@@@@@@%@%++%%%%%%%%#+%@@@@@@@@@@@@@@@@
// ####%#%%%%##+#%%%##%#%%=*@%%###%%%%#%%@@%@@%#%%%=####%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%%%#*#%#%%%%%%#%%@#*###%%%@@@@@@@@@@@%@#*%%%#%#%%%#%%@@@@@@@@@%@@@@@
// #%%%%@##%*%###%#%%%##%**@%#%%###%%@%%@@%#%%%##@*####%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%%%@#-+%%%%%@%%%%%%%@%#%%%%%@@@@@#@%#@@@%**%%###%%%+#@-@@@@@@@%@@@@@@
// ####%%#%#-*+%%%%%%%%#%**%%%%%##%##%%%%%@%%%%@%#+*%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%%%%%#%#*%%@%%%%%#%%##%%%#%#%%%@@%@%%@@@%%@*-#%%%%%%%*#@=@@@@@@%%%%@@@@
// %#*###%%*++%%%%%%%%%%####%%####%%%%%%%%@%%#%%%#+*#%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%%%#%%%%%%@%%%%#%%%%%%%#%%@@@@@@@@%@@@@%@%=#@%%#%%%%=#-*@@@@@%@@@@@@@
// @##**#%*==%#%%%%%%#%%*+%#%%%#%##%%@%@%%@%%##%%%%%%%%%%%%#%%%%#%%%%%%%#%%%%%#%%%%%%%%%%%*#+%%%%%###%%%%%%*#%%%@@@@@@@@%@%@@@=%@%%#%%%%#=#%@@@@@@@%@@@@@
// %%##@%%%=#%###@%%%%%%**%%#%%%##%%%%#%@%@@##%%%%%%%%%%%%%#%%%%#%%#%%%%%%%%%%%%%%#%%%%%#%+*%%%%%%###%%%#%%%#%%@@@@@@%#%%%%@@%=%%%%##%%%%##+*%@@@%%@@@@@@
// %@%%###+*########%%%##%@%#%###%@@%#%%@%%#%#%%#=##%%@%%%#%%%@%%%%%%%%%%%%%%%%%#%%%%%##%%%#%=@%%#@@%@#%%%%*%@@@@@@%%%@@@@%@@@%-#+%#%#%%#%%+*-@@@@@@@@@@@
// #%#%#%#*##%%%%%%%%%%#=%%%%%%%%%%%%%%@@@@#%%%%==##%%#%%%%%%%%%%%%%@%%%%#%%%%%%#%%%#%%%%%%*-##%@%#%%#%#%##%%@@@@@@%#%@@@%%%@@@+%%%%%%%%#%%%#%#@@@@%@@@@@
// %##%%%**%%%##%%#%%%%#*%%%%%%%%%%%%@%@%%%%@%@*#=#%%%#%%%%%%%%%%%%%%%%%%#%%%%%%%#%%%%%%%%%%++=##%%#%##%%%#%@@@@@@@%%@%@@@%@@@%@%%%#%%%%#%%##@-%@@@@@@@@@
// %%#%%#+#%###%%%%%%%==%%%%##%%%%%%%@%@@@%%@%%#%#%%%%#%%%%%%%%%%%%%%%%%@#####%###%%%%%%%%%%%*++#=##%%#%%%%@@@%%@%%%%@@%@@%@@@%@=*%%%%%%%%@%%*#@@@@@@@@@@
// %#%#%-#%##%##%%%@%@-%%%%@%%@%@%@@@%%%%%%%%%=#@%%%##%%%%%%%%%%%%%%%%%%@#%#%#%%%%%#%%#%%%%%%%%+*-%#%###%@@@@@@@%@@%%%@@@@%@@@@@#=%%@#%%%#%%@+%-#@%@@@@@@
// ####%=#%###%%%%%%%%=%%%%%%@@%%%@@@@@%%%%%@@+#%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%%#%%%%%#%%####%#%%%##%%@@@@@@%@@%%@@@@@%%@@@@@#+%%@%%%%%%%%=@-%@@@@@%@@
// @##%#%#######%%#%%%%%@%%@%%%%%@%@@@%%%%%%@%%%%*%##%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%=*%#@%@%%@@@@%@@%%%@@@%%%@@@@@###%@%%%%%@%%+@-*#@@@@@@@
// %%#%+%%#%%#%%%#%%%+#%%%%%%%%%@%@@%@%%%#%@%%@%%#%%%%%%%%%%%%#%%%%%%%%#%%%%#%%%%%%%%%%%%%%%#%%##%%#*##@%@@@%%@@@@@@%@@@%@%@@@@@%%+#@%@%#%@%%%*+**@@@@@@%
// @%#+##%##%%@%%%%%%=%@%%%%%%%%%%@@@@@%@%#%@%#%%##%%%%%%#%%%%%%%%%%%%#%%%%%#%%%%%%%%%%%%#%%%%%%%%%%*#%%@@@@@@@@@%@@@@@@%%%@@@@@@#-#@#%%#%@@%%-%=#@%@@@@%
// #%#+#%#%#####%%%#*#%%%%%%%@@%@@@@%@@%%%%%%**%%%%%%%%%%%%%%%%%%%%%@%%%%%%##%%%%%%%%%%%%##%%%%#%%%%+#@#%@@@@@@@@%@@@@@@#@@@@@@@@#-#%%%%#%%%%@#@+@@@@@@@@
// %%#*%%##%#%%%%%#%+*%%%%@@%%%@%%%@@#%#%@%%%**#%%%%%%%%%%%%%%%%%%@%%%%%%%%%##%%%##%#%%@#%%#%#%###%%#@@@%%@@@@@@@@@@@@@%%%@@@@@@@%%%@%%%#%@%%%%++@@@@@@@%
// *@*=#%%%%#%##%%%##%%#%%%@%@%@%@%%@%%%%@%@%+*#%%%#%%%%%%%%%%%%%%%%%%%%%%%%#%%%%#%%%#%%%%##%%%%%%%**@@%@@@@@@@@@@@@@@@%%%@@@@@@@@##@%%%%%@%%%%%#*%@@@@@@
// #%**##%%%##%#%#%##%@@%%%%@@@@%%@%%%%#%%@%%++%%%%#%%%%%%%%%%%%%%%%%%%%%%%%#%@%%%%%%#%%%%#%%%%%%%%#*@@%%@@@@@@@@@@@@@#%@@@@@@@@@@**%@%%%%%@#%%%*:+@@@@@@
// ####%##%%%##%%%%*%#%@@%%%@@%%@%@%@@%#%%@%#+*%%%%#%%%%%%%%%%@%%%%%%%%%#%%%%%%%%%#%%%@#%%##%%%%%%%%#@@@@@@@@@@@%@@@@@@@@@@@@@@@@@*#@@%%@@%%%%%%%+-@@@@@@
// @%%%###%%*%%%%##**=-@%%%@@@@%%@@@@%%%@%%%*+%%%%%#%%%%%%%%%%@%%%@@%%%%#%%%%%%%%#%#%%%%%##%%%%%%%#=@%@@@@@@@@@@@@@@@@%%@@@@@@@@@%*#@%%%%%%#%%@#%%%@@@@@@
// @*+#%#%%%#@%%%%%%%#--#%%@@%%@%@@%%%%@%@%%**%%%%%#@%%%%%%%@%%%%%%%%%%%%%%%%#%%%%%%%%%%%@%%%@%%#%%+%@@@@@@@@@@@@@@@@#%@@@@@@@@@@@@@%%%%%%%%%%@%@%=@@@@@@
// #+*##%%%%%%%%#%#%%%=-=#@%@@%@%%%%%%@%%%%%#+%%%%%%%%%%%%%@%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#-*%%%%%%%%%%@%=%@+@@@
// ####%%%%%#%%#%##%%%#+:=#%@@@%%%#%%%%@@%@@#+%%%@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@#==%##%%@%%%%@%*#@=@@@
// %#*+#%%%%#%%%%%%%%%##+:-%%%%%#%%%%%%%%@%@#+%%%@%%%%%%%%%%#%%%%%%%%%%%%%%%%@#%%%%%%%%#%%%%%%#%%@-@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%#-%#%%%%%%%%@%%=%-#@@
// @@@%-%#%%#%%###%%##@%#++-@@%%#@@%%%%@@%@@#+%@%@%%%#%%%%%%%%#%%%%%%%%%%%%%%%%%%@%@%%%%%%%%%@%%%%=@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@@%%-%#%%%%%%%%@%%-@#*@@
// @@**=%%%%%@%%%%%%%%%@%%#=##%@%@%@@%%%@@%%*+%@%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@%%%%@@@@@@@@@@@@@@@%@@@@@@@@%@@@@@@@@@@-%%%@%@%%%%%%@@-*#@@
// %@%#%=@%%@%%%%%%%%%%%%%#%-**#@**%@%#@%%@%#*%%###%%#%%%%%@%%%%%%%%%%%%%%%%%%#%%%%%%%@%%%%%%%%%%%#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%-%%%%%%%%%%%%@@+=*@@
// %%%#+*%%%@%%%%##%%%%%%%#%*+=++-++%@=++%%%##%%%%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%%%%%%%%%%%%%%%%%-@@@@@@@@@@@@@%%%@@@@@@@@@@@@@@@@@@=%%%%%%%%%#%%%@@*+@@
// #%@%#++%%@%%%%%#%%%%%%%%%%%######@@--+%%%#%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%#%%%%%%%%%%%%%%%%%#%%%=@@@@@@@@@@@@@%%@@@@@@@@%@@@@@@@@@@*%%%@@%%%#%%%%%@#=#@
// #%%%#%=%%%%%%%@#%%%%#%%@%%%%%@%%%%@%:-*%%####%%%%%%%%%%%%%%%%%%%%@%%@%%%#%%%%%@%%%%%@%%%#%@%%%%%@@@@@@@@@@@@@@%@@@%@@@@@@%@@@@@@@@-=%%#%@@%%%%@%%@%*+@
// %@@%#%*+#%@@@%%@%%%%%%%%%%%%%%@%%%%@%=-#%#%%%%%%%%%%%%%%%%%%@%%%%@%%@%%%%%%%%%%%%%%%%%%%%%%%%%%@%@@@@@@@@@@@@%%@@@@@@@@@@@@@@@@@%=@%%%%%@%%%#%@%%@%++@
// %@@%%%%=+%%@@%%%%%%%%%%%%#%%%%%%%%%%%#=*#@#%@%%%%%%%%%%%%%%%@%%%%%%%%@%%%%%%%#%%%%%%%%%%#%%%%%%%*@@@@@@@@%@@%@@@@@@@@@@@@@@@@@@%*%%@%%%%@%%@#%@%%@%*#@
// *%@%%@@%==%@%@@%%%%@%%%#%%%%%%@%%%%#%#*+*#=*+%%%%%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%%%%%%%#%%%%%%#=@@@@@@@%@%%@@@@@@@@@@@@@@@@*@*##@%%%%%%%%%%#%@%%@%%*@
// #%@@%%@@%-@@@%@%%%%@%#%%%%%%%%%%%%%%%%%#=%=+#=%%%%%%%%%%%%%%%%%%%%%%%%%%%%%@%%%%%%%%%%%%#%%%%%@#=@@@@@@%@@%%@@@@@@@@@@@@@@##%=%%@@%@%@%@%%%#%%@%@%%%=%
// @%@@@@%@@%-%%%%@%%%%@%#@%%%%%#%%##%%#%%%%%+-+%%%%@%%%%%%%%%%@%@%%%%%%@%%#%%%%%%%#%@@@%%%%%%#%%%@=@@@@@@@@@@@@@@@@@@@@@@@-+@=-@%@@%@%%%%##%%#@@@%@%%@=*
// @%@@@@@%@%%+#%%%#%%%@%#%%#%%%%%%#%%#%%%%%%#-%-*%=#%%%%%%%%%%@%%%%%%%%%%%%%@%%%%%%%%%%%%%%%%%%%#%*@@@@@@@%@@@@@@@@%%-%==@@@%%%#%%%%%%%@%#%%%%%%%%%%%%=:
// @@@%@@%@@@@#=+%%@%%@%%%%@#%%%#%%##%%%%%#%%%=%-*%+##%%#%%%%%%%%%#%%%%%%%%%%%%%%%%%%%%%%%%%@%%%%-#@@@@@%@@#@*%@@##%*+*@@@@%%%%%%%%#%%%%@%#%%%%%%%%%%@@+:
// %@@%@@@@@@@%*-=%@%%%@%%%@%%%%%%%%%%%%%##%%%=%*%#%%-%%%%%%%%%%%%%%%%%@@#%%%%%%%%%%%%%%%%%%%%%%+-*@@%##@%@*@#%*%**%%%%@@@%@%%%%%%%#@#%@%#%%%@%%%%%%@@@**
// @@%%@%@@%@@@%%-#=%%%@%%%%%@@%@%%%#%%#%%%%%%==%%%@=-%%%%%%%%%%%@%%%%%@%%%%%%%%%@%%%%%%%%%%%%@*-#@%#@@@@*=%@@+=@@%%%%%@%%%@%%%%@%%%%%%%%%@%%%%%@@%@@+##@
// %%@@%@@%#@%%@@#@+*#%%%%%%%%@%@%%@%%%@##%%%%%#%%%%@:=%%%%%%%%%%%%%%@%%%%%%@%#%@@%%%%%%%%%%%%#-*%@@%==------%%@@%@%%%@%%%%#%%%#%%%%%%%%%%%%@@%@@%@@*-*@@
// #@@@%@@@%%%@@%@=##+%%%%%%%%%%%@%%%%%%%%%%@%#%%@%%@-=%%%%%%%%%%@%%%@%%%%%%@%%@%%%@%%%%@%%%%#-++=++*+==+@%@%%%%%%%%%%%%%%%%##%%%%%%#%#%@%%@@%@@#+#%@*@@@
// #%%@@@@@@@@%@@@@+++@%%%%%@%%%%%%%%#%%%%%%%%%%%@@#*+=#%%%%%%%%%%%%%%%%%%%%@%%%*#%%%#%%@%%%%+=%%%%%%%@@@%%%%%%%@%%%%%%%%%%%%%%%%%%%%%%%%%%@%@@%+*%@@@@@@
// %%%%@@%@@@@@@@@@%==%@%%%%%%%%@%%%%%%%%%%%%%%#%@@+*+#%%@%%%%%@%%%%%%%%%%%@@%%=+#%#+%%%%%%%%-#%%%%%@%@@%%%##%%%%%@%%%@%%%%%%#%%%%%%%%%%%%@%%@%=+*@@@@@@@
// %%%%%%%@@@@@@@@@@%=%@%%@%%@%@%%%%%@%%%%#%%###%%@=%=@*#%%%%%%@%*#%##%%%%%%+===%%%=#%%%#--+=#%%%%%%@@@%%%%%%%%%%@%%%%%%%%%%%%%%@%%%%@%@@%%%@%%-+@@@@@@@@
// @%@@@@@@%%@@@@@@@@@*@@%%%%%%%%%%@%#@%%%%%%%%%@@%=%-#**-+%%@%%%+#%#%%%###+---%%%-=%%#-%%%=#%%%%%@@%@%%%%%@#%%%@%##%%%%%#@%%%%%%@#%%%%%@%-%*#@=@@@@@@@@@
// #@%%@@@@@@@@@@@@@@@+-#@%%@%%%%#%%%#%%%%%#%%%%%@@==-=+*+#%@%#%#-*##%#%%#+++*%%#+-#%%+*##*%%%%%%@@@%%%%%%@%%%%%%#%%%%%%%@@%%%%%@%%%%@%%#-=*#@@%@@@@@@@@@
// #%%%@@@%%@@@@@@@@@@@+=*%@%%%%%#%%%#%%%%%#%%%@%%@*%-=*-%-#%@+%#+#+#%%%%+=*#%*##+-+##+++#@%%%%%%@@%%%@@%%%%%%%%%%%%%%%%%%%%%%%%%%%@@%@%=-%#@@@@@@@@@@@@@
// %%@%@%@%@@@@@@@@@@@@@##+@@%%%%#%%%%%%%%%#%%#%%%@%@-+#*+-=#@%@*##=#%%%+-+*%+--+**%=-+==#%%%%%%@@%%%%@%%%%%#%%%%%%%%%%%%%%%%%%%%%%%@%%*-#@@@@@@@@@@@@@@@
// @@@@@@@%@@@@@@@@@@@@@@@%=%@%%%%#%#%%@#%%#%@%%@%@%=-==%%-*-%@=##=#%*--##+%=.+=*=--..::-@%@@%%@%@%%@@%%%%%%%%%@%%%%%%%%%%%@%%%#%%@@@%#*%@@@@@@@@@@@@@@@@
// %@@@%@@@%@@@%@@@@@@@@@@@@#+@@%%%%%%%%%%#%#%%%@%%%@--=#*-=++%-%%*#%%+*---=*+**. .*. :*@=%@%%%@%%#%@%%%%#%%@%%@%%%%%%%%%%@@%%#%%@#=-@%@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@%*@+%%#%%%%%%%@#%##@%***::=*#*#+*--*+#@@%*==+:- = . :+.:-*=#*%%%%%@@%%%%%%%%%%@%%@%%%%%%%@%%%@%%%%@%#+=%@@@@@@@@@@@@@@@@@@@@
// @@@@@%@@@@@@@@@@@@@@@@@@@@@#%#*%%%#%%%%%#####@%#+-=:=*:*+=+-=#*%%%*#++ :-. -:.-..-:=%=@%%%%@@%%%%%%%%%%%%@%@%%%%%%%%%%%%%%%@@**=+@@@@@@@@@@@@@@@@@@@@@
// %@@@@@@@@@@@@@@@@@@@@@@@@@@@@##%%%%%%%%###%##%%@%=%:+=-**-=-:=*#%++-: ... +:.==.-=:-+=%%%%%@@%%%%@%%%#%@%%%%%%%%@%#%%%%%%%@@++*+@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@%@@@@@@@@%@@@@%%#%#%%#%%####@%*+-#--+=.--=...:--*+:-..:=*:-:-:::-=*-#@%%@%@%%%@%%%%%%%%%%%@%@%@%%%%%%%@%%---=@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@+%##%%%##%#%##%%*.-%..*.::-. -#-=@.:--=.-+--.-:.:=-#=%%%%%@@%@%@%#%%%%%%%%@@%@%@@%%%%%%%+-#==@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=@%%%%%%%%##%#%##=:* .- -.::=#*-- :-*-.*-:= -.::#*:#=**@%%%%%%%%%%%%%@%%%@@%%@%%%%@%##+=#-=#@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%=%%#%%%@%%#%%%%##-:..:+.:.:=:==-.::*=+:-::. .  :-.=%**%@%@%%%%%%%%%%@@%%%@@%%%%@%###-*=**#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@%@@@@@@%@@@%=%@%#%%%%%#%%#%%%-...... -=:++:+--=::.=---:.- ..: =**@@@%@@@%%%%@@%%@%%@@@%%@@@+%%+%-*%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@%%@@@@@@@@@@@@@@@@@@@@@@=#@%%%%@%##%%%%#+:.- .  .++-==:-+#:  .#:...# .=:.%%=*%@%%%%%%%%%@%@%%%@@@=----@----@%@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@
// %@@@@@@%@@@@@@@@@@@@@@@@@@@@@@@=%@%%@%%%#%#%%%#--#-    *+:*-.=+. :...-:.:*.:+:.-*=:#%@@%%%%%%@@%%@%#%+*#@@#*@==@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@=%%@%%%%%%%#%%@#-=+:. .:-##=.::.=.:-::. =*=:...:-+=-#@@@%%%%@@%@%%%#+%#@*+*+=%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@%@@@%@@@@@@@*@%%%%%%%%%%%%@**%-   ===+*-=+=+=-+-..-=+*:.:-:-*%=##%@@%%%%@@@%%%**@@#%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%%%%%@%%%%%#@-*@.+=.=*=-#+#=.-=.-:=*:-::.+.#--+=#@@%@@@%@%%%%%%%*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
// @@@@@@@@@@@@@@@@@@@@@@@@@@@@#@@#%%%%%%@%%%%@@@*#= %:-.++*+=%.#%--%%+#+=%%%@%%@@@-@@@@@%@@%@%%%@@+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@

//Metti For Roe v. Wade is a NFT art collection from Pumpametti to support a woman's right to choose. SCOTUS' overturn of Roe v. Wade further distances America from one of the core principles of American constitutional democracy, the separation of church and state. 
//Free mint of 1000 art pieces, 300 reserved for OG Pumpametti collectors. 
//All royalties from this collection will go to support non-profit organizations fighting for women's reproductive rights.

//SPDX-License-Identifier: MIT

interface PumpaInterface {
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function balanceOf(address owner) external view returns (uint256 balance);
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);
}

pragma solidity ^0.8.0;






contract MettiForRoeVWade is ERC721Enumerable, Ownable, IERC2981 {
  using Strings for uint256;
  using SafeMath for uint256;
 
  string public baseURI;
  string public baseExtension = ".json";
  string public notRevealedUri;
  uint256 public cost = 0 ether;
  uint256 public maxPumpaSupply = 300;
  uint256 public maxPublicSupply = 700;
  uint256 public maxMintAmount = 1;
  bool public paused = false;
  bool public revealed = false;
  
  uint16 internal royalty = 700; // base 10000, 7%
  uint16 public constant BASE = 1000;

  address public PumpaAddress = 0x09646c5c1e42ede848A57d6542382C32f2877164;
  PumpaInterface PumpaContract = PumpaInterface(PumpaAddress);
  uint public PumpaOwnersSupplyMinted = 0;
  uint public PublicSupplyMinted = 0;

  constructor( 
    string memory _initBaseURI,
    string memory _initNotRevealedUri
  ) ERC721("MettiForRoeVWade", "METTI4ROE") {
    setBaseURI(_initBaseURI);
    setNotRevealedURI(_initNotRevealedUri);
  }

  // internal
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  function PumpaFirstChoiceVIPMint(uint PumpaId) public payable {
    require(PumpaId > 0 && PumpaId <= 300, "Token ID invalid");
    require(PumpaContract.ownerOf(PumpaId) == msg.sender, "Not the owner of this Pumpa");

    _safeMint(msg.sender, PumpaId);
  }

function PublicMint(uint256 _mintAmount) public payable {
    require(!paused);
    require(_mintAmount > 0);
    require(msg.value >= 0 ether * _mintAmount);
    require(_mintAmount <= maxMintAmount);
    require( tx.origin == msg.sender, "CANNOT MINT THROUGH A CUSTOM CONTRACT");
    require(PublicSupplyMinted + _mintAmount <= maxPublicSupply, "No more Public supply left");

    for (uint256 i = 1; i <= _mintAmount; i++) {
      _safeMint(msg.sender, maxPumpaSupply + PublicSupplyMinted + i);
    }
    PublicSupplyMinted = PublicSupplyMinted + _mintAmount;
}

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
    if(revealed == false) {
        return notRevealedUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }
  
  //onlyOwner
  
  function reveal() public onlyOwner {
      revealed = true;
  }
  
  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }
  
  function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
    notRevealedUri = _notRevealedURI;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }
  
  function royaltyInfo(uint256, uint256 _salePrice)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        return (address(this), (_salePrice * royalty) / BASE);
    }

  function setRoyalty(uint16 _royalty) public virtual onlyOwner {
        require(_royalty >= 0 && _royalty <= 1000, 'Royalty must be between 0% and 10%.');

        royalty = _royalty;
    }

  function withdraw() public payable onlyOwner {
    require(payable(msg.sender).send(address(this).balance));
  }
  
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"PublicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"PublicSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PumpaAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"PumpaId","type":"uint256"}],"name":"PumpaFirstChoiceVIPMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"PumpaOwnersSupplyMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPumpaSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_royalty","type":"uint16"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c908051906020019062000051929190620004ea565b506000600e5561012c600f556102bc60105560016011556000601260006101000a81548160ff0219169083151502179055506000601260016101000a81548160ff0219169083151502179055506102bc601260026101000a81548161ffff021916908361ffff1602179055507309646c5c1e42ede848a57d6542382c32f2877164601260046101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601260049054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060145560006015553480156200018c57600080fd5b5060405162005281380380620052818339818101604052810190620001b2919062000618565b6040518060400160405280601081526020017f4d65747469466f72526f655657616465000000000000000000000000000000008152506040518060400160405280600981526020017f4d4554544934524f450000000000000000000000000000000000000000000000815250816000908051906020019062000236929190620004ea565b5080600190805190602001906200024f929190620004ea565b50505062000272620002666200029c60201b60201c565b620002a460201b60201c565b62000283826200036a60201b60201c565b62000294816200041560201b60201c565b5050620008a4565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200037a6200029c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003a0620004c060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003f9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f090620006c4565b60405180910390fd5b80600b908051906020019062000411929190620004ea565b5050565b620004256200029c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200044b620004c060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620004a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049b90620006c4565b60405180910390fd5b80600d9080519060200190620004bc929190620004ea565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004f8906200078c565b90600052602060002090601f0160209004810192826200051c576000855562000568565b82601f106200053757805160ff191683800117855562000568565b8280016001018555821562000568579182015b82811115620005675782518255916020019190600101906200054a565b5b5090506200057791906200057b565b5090565b5b80821115620005965760008160009055506001016200057c565b5090565b6000620005b1620005ab846200070f565b620006e6565b905082815260208101848484011115620005d057620005cf6200085b565b5b620005dd84828562000756565b509392505050565b600082601f830112620005fd57620005fc62000856565b5b81516200060f8482602086016200059a565b91505092915050565b6000806040838503121562000632576200063162000865565b5b600083015167ffffffffffffffff81111562000653576200065262000860565b5b6200066185828601620005e5565b925050602083015167ffffffffffffffff81111562000685576200068462000860565b5b6200069385828601620005e5565b9150509250929050565b6000620006ac60208362000745565b9150620006b9826200087b565b602082019050919050565b60006020820190508181036000830152620006df816200069d565b9050919050565b6000620006f262000705565b9050620007008282620007c2565b919050565b6000604051905090565b600067ffffffffffffffff8211156200072d576200072c62000827565b5b62000738826200086a565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200077657808201518184015260208101905062000759565b8381111562000786576000848401525b50505050565b60006002820490506001821680620007a557607f821691505b60208210811415620007bc57620007bb620007f8565b5b50919050565b620007cd826200086a565b810181811067ffffffffffffffff82111715620007ef57620007ee62000827565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6149cd80620008b46000396000f3fe6080604052600436106102515760003560e01c80635c975abb11610139578063ac361ff1116100b6578063d19838791161007a578063d19838791461087c578063da3ef23f146108a7578063e985e9c5146108d0578063ec342ad01461090d578063f2c4ce1e14610938578063f2fde38b1461096157610251565b8063ac361ff1146107a4578063b88d4fde146107c0578063bbe9a8d2146107e9578063c668286214610814578063c87b56dd1461083f57610251565b80638da5cb5b116100fd5780638da5cb5b146106f257806395d89b411461071d5780639fb17e3414610748578063a22cb46514610764578063a475b5dd1461078d57610251565b80635c975abb1461060b5780636352211e146106365780636c0360eb1461067357806370a082311461069e578063715018a6146106db57610251565b806326a74d8e116101d25780633ccfd60b116101965780633ccfd60b1461051c57806342842e0e146105265780634f6ccce71461054f578063518302271461058c57806355f804b3146105b757806356c8cdd1146105e057610251565b806326a74d8e146104225780632a55205a1461044d5780632d1835031461048b5780632f745c59146104b657806336e79a5a146104f357610251565b8063095ea7b311610219578063095ea7b31461034f57806313faede61461037857806318160ddd146103a3578063239c70ae146103ce57806323b872dd146103f957610251565b806301ffc9a71461025657806302329a291461029357806306fdde03146102bc578063081812fc146102e7578063081c8c4414610324575b600080fd5b34801561026257600080fd5b5061027d6004803603810190610278919061346d565b61098a565b60405161028a9190613aee565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190613440565b610a04565b005b3480156102c857600080fd5b506102d1610a9d565b6040516102de9190613b09565b60405180910390f35b3480156102f357600080fd5b5061030e6004803603810190610309919061353d565b610b2f565b60405161031b9190613a5e565b60405180910390f35b34801561033057600080fd5b50610339610bb4565b6040516103469190613b09565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190613400565b610c42565b005b34801561038457600080fd5b5061038d610d5a565b60405161039a9190613e26565b60405180910390f35b3480156103af57600080fd5b506103b8610d60565b6040516103c59190613e26565b60405180910390f35b3480156103da57600080fd5b506103e3610d6d565b6040516103f09190613e26565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b91906132ea565b610d73565b005b34801561042e57600080fd5b50610437610dd3565b6040516104449190613e26565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f919061356a565b610dd9565b604051610482929190613ac5565b60405180910390f35b34801561049757600080fd5b506104a0610e19565b6040516104ad9190613e26565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190613400565b610e1f565b6040516104ea9190613e26565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613510565b610ec4565b005b610524610fba565b005b34801561053257600080fd5b5061054d600480360381019061054891906132ea565b611076565b005b34801561055b57600080fd5b506105766004803603810190610571919061353d565b611096565b6040516105839190613e26565b60405180910390f35b34801561059857600080fd5b506105a1611107565b6040516105ae9190613aee565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d991906134c7565b61111a565b005b3480156105ec57600080fd5b506105f56111b0565b6040516106029190613e26565b60405180910390f35b34801561061757600080fd5b506106206111b6565b60405161062d9190613aee565b60405180910390f35b34801561064257600080fd5b5061065d6004803603810190610658919061353d565b6111c9565b60405161066a9190613a5e565b60405180910390f35b34801561067f57600080fd5b5061068861127b565b6040516106959190613b09565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190613250565b611309565b6040516106d29190613e26565b60405180910390f35b3480156106e757600080fd5b506106f06113c1565b005b3480156106fe57600080fd5b50610707611449565b6040516107149190613a5e565b60405180910390f35b34801561072957600080fd5b50610732611473565b60405161073f9190613b09565b60405180910390f35b610762600480360381019061075d919061353d565b611505565b005b34801561077057600080fd5b5061078b600480360381019061078691906133c0565b611671565b005b34801561079957600080fd5b506107a2611687565b005b6107be60048036038101906107b9919061353d565b611720565b005b3480156107cc57600080fd5b506107e760048036038101906107e2919061333d565b611896565b005b3480156107f557600080fd5b506107fe6118f8565b60405161080b9190613a5e565b60405180910390f35b34801561082057600080fd5b5061082961191e565b6040516108369190613b09565b60405180910390f35b34801561084b57600080fd5b506108666004803603810190610861919061353d565b6119ac565b6040516108739190613b09565b60405180910390f35b34801561088857600080fd5b50610891611b05565b60405161089e9190613e26565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c991906134c7565b611b0b565b005b3480156108dc57600080fd5b506108f760048036038101906108f291906132aa565b611ba1565b6040516109049190613aee565b60405180910390f35b34801561091957600080fd5b50610922611c35565b60405161092f9190613e0b565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a91906134c7565b611c3b565b005b34801561096d57600080fd5b5061098860048036038101906109839190613250565b611cd1565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fd57506109fc82611dc9565b5b9050919050565b610a0c611eab565b73ffffffffffffffffffffffffffffffffffffffff16610a2a611449565b73ffffffffffffffffffffffffffffffffffffffff1614610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790613d2b565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b606060008054610aac906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad8906140f9565b8015610b255780601f10610afa57610100808354040283529160200191610b25565b820191906000526020600020905b815481529060010190602001808311610b0857829003601f168201915b5050505050905090565b6000610b3a82611eb3565b610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613d0b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610bc1906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bed906140f9565b8015610c3a5780601f10610c0f57610100808354040283529160200191610c3a565b820191906000526020600020905b815481529060010190602001808311610c1d57829003601f168201915b505050505081565b6000610c4d826111c9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590613d8b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cdd611eab565b73ffffffffffffffffffffffffffffffffffffffff161480610d0c5750610d0b81610d06611eab565b611ba1565b5b610d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4290613c8b565b60405180910390fd5b610d558383611f1f565b505050565b600e5481565b6000600880549050905090565b60115481565b610d84610d7e611eab565b82611fd8565b610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90613dab565b60405180910390fd5b610dce8383836120b6565b505050565b60105481565b600080306103e861ffff16601260029054906101000a900461ffff1661ffff1685610e049190613fa7565b610e0e9190613f76565b915091509250929050565b600f5481565b6000610e2a83611309565b8210610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613b4b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ecc611eab565b73ffffffffffffffffffffffffffffffffffffffff16610eea611449565b73ffffffffffffffffffffffffffffffffffffffff1614610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790613d2b565b60405180910390fd5b60008161ffff1610158015610f5b57506103e88161ffff1611155b610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190613c6b565b60405180910390fd5b80601260026101000a81548161ffff021916908361ffff16021790555050565b610fc2611eab565b73ffffffffffffffffffffffffffffffffffffffff16610fe0611449565b73ffffffffffffffffffffffffffffffffffffffff1614611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90613d2b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061107457600080fd5b565b61109183838360405180602001604052806000815250611896565b505050565b60006110a0610d60565b82106110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890613dcb565b60405180910390fd5b600882815481106110f5576110f4614292565b5b90600052602060002001549050919050565b601260019054906101000a900460ff1681565b611122611eab565b73ffffffffffffffffffffffffffffffffffffffff16611140611449565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90613d2b565b60405180910390fd5b80600b90805190602001906111ac92919061303a565b5050565b60145481565b601260009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126990613ccb565b60405180910390fd5b80915050919050565b600b8054611288906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546112b4906140f9565b80156113015780601f106112d657610100808354040283529160200191611301565b820191906000526020600020905b8154815290600101906020018083116112e457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190613cab565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113c9611eab565b73ffffffffffffffffffffffffffffffffffffffff166113e7611449565b73ffffffffffffffffffffffffffffffffffffffff161461143d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143490613d2b565b60405180910390fd5b611447600061231d565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611482906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546114ae906140f9565b80156114fb5780601f106114d0576101008083540402835291602001916114fb565b820191906000526020600020905b8154815290600101906020018083116114de57829003601f168201915b5050505050905090565b601260009054906101000a900460ff161561151f57600080fd5b6000811161152c57600080fd5b8060006115399190613fa7565b34101561154557600080fd5b60115481111561155457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990613beb565b60405180910390fd5b601054816015546115d39190613f20565b1115611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160b90613b2b565b60405180910390fd5b6000600190505b818111611659576116463382601554600f546116379190613f20565b6116419190613f20565b6123e3565b80806116519061415c565b91505061161b565b50806015546116689190613f20565b60158190555050565b61168361167c611eab565b8383612401565b5050565b61168f611eab565b73ffffffffffffffffffffffffffffffffffffffff166116ad611449565b73ffffffffffffffffffffffffffffffffffffffff1614611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa90613d2b565b60405180910390fd5b6001601260016101000a81548160ff021916908315150217905550565b600081118015611732575061012c8111155b611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613d4b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016117e39190613e26565b60206040518083038186803b1580156117fb57600080fd5b505afa15801561180f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611833919061327d565b73ffffffffffffffffffffffffffffffffffffffff1614611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090613deb565b60405180910390fd5b61189333826123e3565b50565b6118a76118a1611eab565b83611fd8565b6118e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dd90613dab565b60405180910390fd5b6118f28484848461256e565b50505050565b601260049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c805461192b906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611957906140f9565b80156119a45780601f10611979576101008083540402835291602001916119a4565b820191906000526020600020905b81548152906001019060200180831161198757829003601f168201915b505050505081565b60606119b782611eb3565b6119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90613d6b565b60405180910390fd5b60001515601260019054906101000a900460ff1615151415611aa457600d8054611a1f906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4b906140f9565b8015611a985780601f10611a6d57610100808354040283529160200191611a98565b820191906000526020600020905b815481529060010190602001808311611a7b57829003601f168201915b50505050509050611b00565b6000611aae6125ca565b90506000815111611ace5760405180602001604052806000815250611afc565b80611ad88461265c565b600c604051602001611aec93929190613a2d565b6040516020818303038152906040525b9150505b919050565b60155481565b611b13611eab565b73ffffffffffffffffffffffffffffffffffffffff16611b31611449565b73ffffffffffffffffffffffffffffffffffffffff1614611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e90613d2b565b60405180910390fd5b80600c9080519060200190611b9d92919061303a565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6103e881565b611c43611eab565b73ffffffffffffffffffffffffffffffffffffffff16611c61611449565b73ffffffffffffffffffffffffffffffffffffffff1614611cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cae90613d2b565b60405180910390fd5b80600d9080519060200190611ccd92919061303a565b5050565b611cd9611eab565b73ffffffffffffffffffffffffffffffffffffffff16611cf7611449565b73ffffffffffffffffffffffffffffffffffffffff1614611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490613d2b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db490613b8b565b60405180910390fd5b611dc68161231d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e9457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ea45750611ea3826127bd565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f92836111c9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fe382611eb3565b612022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201990613c4b565b60405180910390fd5b600061202d836111c9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061206f575061206e8185611ba1565b5b806120ad57508373ffffffffffffffffffffffffffffffffffffffff1661209584610b2f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120d6826111c9565b73ffffffffffffffffffffffffffffffffffffffff161461212c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212390613bab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561219c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219390613c0b565b60405180910390fd5b6121a7838383612827565b6121b2600082611f1f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122029190614001565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122599190613f20565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461231883838361293b565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123fd828260405180602001604052806000815250612940565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246790613c2b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125619190613aee565b60405180910390a3505050565b6125798484846120b6565b6125858484848461299b565b6125c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bb90613b6b565b60405180910390fd5b50505050565b6060600b80546125d9906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612605906140f9565b80156126525780601f1061262757610100808354040283529160200191612652565b820191906000526020600020905b81548152906001019060200180831161263557829003601f168201915b5050505050905090565b606060008214156126a4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127b8565b600082905060005b600082146126d65780806126bf9061415c565b915050600a826126cf9190613f76565b91506126ac565b60008167ffffffffffffffff8111156126f2576126f16142c1565b5b6040519080825280601f01601f1916602001820160405280156127245781602001600182028036833780820191505090505b5090505b600085146127b15760018261273d9190614001565b9150600a8561274c91906141a5565b60306127589190613f20565b60f81b81838151811061276e5761276d614292565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127aa9190613f76565b9450612728565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612832838383612b32565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128755761287081612b37565b6128b4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128b3576128b28382612b80565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128f7576128f281612ced565b612936565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612935576129348282612dbe565b5b5b505050565b505050565b61294a8383612e3d565b612957600084848461299b565b612996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298d90613b6b565b60405180910390fd5b505050565b60006129bc8473ffffffffffffffffffffffffffffffffffffffff16613017565b15612b25578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e5611eab565b8786866040518563ffffffff1660e01b8152600401612a079493929190613a79565b602060405180830381600087803b158015612a2157600080fd5b505af1925050508015612a5257506040513d601f19601f82011682018060405250810190612a4f919061349a565b60015b612ad5573d8060008114612a82576040519150601f19603f3d011682016040523d82523d6000602084013e612a87565b606091505b50600081511415612acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac490613b6b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b2a565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b8d84611309565b612b979190614001565b9050600060076000848152602001908152602001600020549050818114612c7c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d019190614001565b9050600060096000848152602001908152602001600020549050600060088381548110612d3157612d30614292565b5b906000526020600020015490508060088381548110612d5357612d52614292565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612da257612da1614263565b5b6001900381819060005260206000200160009055905550505050565b6000612dc983611309565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea490613ceb565b60405180910390fd5b612eb681611eb3565b15612ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eed90613bcb565b60405180910390fd5b612f0260008383612827565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f529190613f20565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130136000838361293b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613046906140f9565b90600052602060002090601f01602090048101928261306857600085556130af565b82601f1061308157805160ff19168380011785556130af565b828001600101855582156130af579182015b828111156130ae578251825591602001919060010190613093565b5b5090506130bc91906130c0565b5090565b5b808211156130d95760008160009055506001016130c1565b5090565b60006130f06130eb84613e66565b613e41565b90508281526020810184848401111561310c5761310b6142f5565b5b6131178482856140b7565b509392505050565b600061313261312d84613e97565b613e41565b90508281526020810184848401111561314e5761314d6142f5565b5b6131598482856140b7565b509392505050565b60008135905061317081614924565b92915050565b60008151905061318581614924565b92915050565b60008135905061319a8161493b565b92915050565b6000813590506131af81614952565b92915050565b6000815190506131c481614952565b92915050565b600082601f8301126131df576131de6142f0565b5b81356131ef8482602086016130dd565b91505092915050565b600082601f83011261320d5761320c6142f0565b5b813561321d84826020860161311f565b91505092915050565b60008135905061323581614969565b92915050565b60008135905061324a81614980565b92915050565b600060208284031215613266576132656142ff565b5b600061327484828501613161565b91505092915050565b600060208284031215613293576132926142ff565b5b60006132a184828501613176565b91505092915050565b600080604083850312156132c1576132c06142ff565b5b60006132cf85828601613161565b92505060206132e085828601613161565b9150509250929050565b600080600060608486031215613303576133026142ff565b5b600061331186828701613161565b935050602061332286828701613161565b92505060406133338682870161323b565b9150509250925092565b60008060008060808587031215613357576133566142ff565b5b600061336587828801613161565b945050602061337687828801613161565b93505060406133878782880161323b565b925050606085013567ffffffffffffffff8111156133a8576133a76142fa565b5b6133b4878288016131ca565b91505092959194509250565b600080604083850312156133d7576133d66142ff565b5b60006133e585828601613161565b92505060206133f68582860161318b565b9150509250929050565b60008060408385031215613417576134166142ff565b5b600061342585828601613161565b92505060206134368582860161323b565b9150509250929050565b600060208284031215613456576134556142ff565b5b60006134648482850161318b565b91505092915050565b600060208284031215613483576134826142ff565b5b6000613491848285016131a0565b91505092915050565b6000602082840312156134b0576134af6142ff565b5b60006134be848285016131b5565b91505092915050565b6000602082840312156134dd576134dc6142ff565b5b600082013567ffffffffffffffff8111156134fb576134fa6142fa565b5b613507848285016131f8565b91505092915050565b600060208284031215613526576135256142ff565b5b600061353484828501613226565b91505092915050565b600060208284031215613553576135526142ff565b5b60006135618482850161323b565b91505092915050565b60008060408385031215613581576135806142ff565b5b600061358f8582860161323b565b92505060206135a08582860161323b565b9150509250929050565b6135b381614035565b82525050565b6135c281614047565b82525050565b60006135d382613edd565b6135dd8185613ef3565b93506135ed8185602086016140c6565b6135f681614304565b840191505092915050565b600061360c82613ee8565b6136168185613f04565b93506136268185602086016140c6565b61362f81614304565b840191505092915050565b600061364582613ee8565b61364f8185613f15565b935061365f8185602086016140c6565b80840191505092915050565b60008154613678816140f9565b6136828186613f15565b9450600182166000811461369d57600181146136ae576136e1565b60ff198316865281860193506136e1565b6136b785613ec8565b60005b838110156136d9578154818901526001820191506020810190506136ba565b838801955050505b50505092915050565b60006136f7601a83613f04565b915061370282614315565b602082019050919050565b600061371a602b83613f04565b91506137258261433e565b604082019050919050565b600061373d603283613f04565b91506137488261438d565b604082019050919050565b6000613760602683613f04565b915061376b826143dc565b604082019050919050565b6000613783602583613f04565b915061378e8261442b565b604082019050919050565b60006137a6601c83613f04565b91506137b18261447a565b602082019050919050565b60006137c9602583613f04565b91506137d4826144a3565b604082019050919050565b60006137ec602483613f04565b91506137f7826144f2565b604082019050919050565b600061380f601983613f04565b915061381a82614541565b602082019050919050565b6000613832602c83613f04565b915061383d8261456a565b604082019050919050565b6000613855602383613f04565b9150613860826145b9565b604082019050919050565b6000613878603883613f04565b915061388382614608565b604082019050919050565b600061389b602a83613f04565b91506138a682614657565b604082019050919050565b60006138be602983613f04565b91506138c9826146a6565b604082019050919050565b60006138e1602083613f04565b91506138ec826146f5565b602082019050919050565b6000613904602c83613f04565b915061390f8261471e565b604082019050919050565b6000613927602083613f04565b91506139328261476d565b602082019050919050565b600061394a601083613f04565b915061395582614796565b602082019050919050565b600061396d602f83613f04565b9150613978826147bf565b604082019050919050565b6000613990602183613f04565b915061399b8261480e565b604082019050919050565b60006139b3603183613f04565b91506139be8261485d565b604082019050919050565b60006139d6602c83613f04565b91506139e1826148ac565b604082019050919050565b60006139f9601b83613f04565b9150613a04826148fb565b602082019050919050565b613a188161407f565b82525050565b613a27816140ad565b82525050565b6000613a39828661363a565b9150613a45828561363a565b9150613a51828461366b565b9150819050949350505050565b6000602082019050613a7360008301846135aa565b92915050565b6000608082019050613a8e60008301876135aa565b613a9b60208301866135aa565b613aa86040830185613a1e565b8181036060830152613aba81846135c8565b905095945050505050565b6000604082019050613ada60008301856135aa565b613ae76020830184613a1e565b9392505050565b6000602082019050613b0360008301846135b9565b92915050565b60006020820190508181036000830152613b238184613601565b905092915050565b60006020820190508181036000830152613b44816136ea565b9050919050565b60006020820190508181036000830152613b648161370d565b9050919050565b60006020820190508181036000830152613b8481613730565b9050919050565b60006020820190508181036000830152613ba481613753565b9050919050565b60006020820190508181036000830152613bc481613776565b9050919050565b60006020820190508181036000830152613be481613799565b9050919050565b60006020820190508181036000830152613c04816137bc565b9050919050565b60006020820190508181036000830152613c24816137df565b9050919050565b60006020820190508181036000830152613c4481613802565b9050919050565b60006020820190508181036000830152613c6481613825565b9050919050565b60006020820190508181036000830152613c8481613848565b9050919050565b60006020820190508181036000830152613ca48161386b565b9050919050565b60006020820190508181036000830152613cc48161388e565b9050919050565b60006020820190508181036000830152613ce4816138b1565b9050919050565b60006020820190508181036000830152613d04816138d4565b9050919050565b60006020820190508181036000830152613d24816138f7565b9050919050565b60006020820190508181036000830152613d448161391a565b9050919050565b60006020820190508181036000830152613d648161393d565b9050919050565b60006020820190508181036000830152613d8481613960565b9050919050565b60006020820190508181036000830152613da481613983565b9050919050565b60006020820190508181036000830152613dc4816139a6565b9050919050565b60006020820190508181036000830152613de4816139c9565b9050919050565b60006020820190508181036000830152613e04816139ec565b9050919050565b6000602082019050613e206000830184613a0f565b92915050565b6000602082019050613e3b6000830184613a1e565b92915050565b6000613e4b613e5c565b9050613e57828261412b565b919050565b6000604051905090565b600067ffffffffffffffff821115613e8157613e806142c1565b5b613e8a82614304565b9050602081019050919050565b600067ffffffffffffffff821115613eb257613eb16142c1565b5b613ebb82614304565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f2b826140ad565b9150613f36836140ad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f6b57613f6a6141d6565b5b828201905092915050565b6000613f81826140ad565b9150613f8c836140ad565b925082613f9c57613f9b614205565b5b828204905092915050565b6000613fb2826140ad565b9150613fbd836140ad565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ff657613ff56141d6565b5b828202905092915050565b600061400c826140ad565b9150614017836140ad565b92508282101561402a576140296141d6565b5b828203905092915050565b60006140408261408d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140e45780820151818401526020810190506140c9565b838111156140f3576000848401525b50505050565b6000600282049050600182168061411157607f821691505b6020821081141561412557614124614234565b5b50919050565b61413482614304565b810181811067ffffffffffffffff82111715614153576141526142c1565b5b80604052505050565b6000614167826140ad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561419a576141996141d6565b5b600182019050919050565b60006141b0826140ad565b91506141bb836140ad565b9250826141cb576141ca614205565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f206d6f7265205075626c696320737570706c79206c656674000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43414e4e4f54204d494e54205448524f554748204120435553544f4d20434f4e60008201527f5452414354000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f526f79616c7479206d757374206265206265747765656e20302520616e64203160008201527f30252e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f7420746865206f776e6572206f6620746869732050756d70610000000000600082015250565b61492d81614035565b811461493857600080fd5b50565b61494481614047565b811461494f57600080fd5b50565b61495b81614053565b811461496657600080fd5b50565b6149728161407f565b811461497d57600080fd5b50565b614989816140ad565b811461499457600080fd5b5056fea26469706673582212209d4e5ac0a59305bdb6e79611d2dfa07f0004d13973df6f8d7b6c997f5f20216664736f6c634300080700330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102515760003560e01c80635c975abb11610139578063ac361ff1116100b6578063d19838791161007a578063d19838791461087c578063da3ef23f146108a7578063e985e9c5146108d0578063ec342ad01461090d578063f2c4ce1e14610938578063f2fde38b1461096157610251565b8063ac361ff1146107a4578063b88d4fde146107c0578063bbe9a8d2146107e9578063c668286214610814578063c87b56dd1461083f57610251565b80638da5cb5b116100fd5780638da5cb5b146106f257806395d89b411461071d5780639fb17e3414610748578063a22cb46514610764578063a475b5dd1461078d57610251565b80635c975abb1461060b5780636352211e146106365780636c0360eb1461067357806370a082311461069e578063715018a6146106db57610251565b806326a74d8e116101d25780633ccfd60b116101965780633ccfd60b1461051c57806342842e0e146105265780634f6ccce71461054f578063518302271461058c57806355f804b3146105b757806356c8cdd1146105e057610251565b806326a74d8e146104225780632a55205a1461044d5780632d1835031461048b5780632f745c59146104b657806336e79a5a146104f357610251565b8063095ea7b311610219578063095ea7b31461034f57806313faede61461037857806318160ddd146103a3578063239c70ae146103ce57806323b872dd146103f957610251565b806301ffc9a71461025657806302329a291461029357806306fdde03146102bc578063081812fc146102e7578063081c8c4414610324575b600080fd5b34801561026257600080fd5b5061027d6004803603810190610278919061346d565b61098a565b60405161028a9190613aee565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190613440565b610a04565b005b3480156102c857600080fd5b506102d1610a9d565b6040516102de9190613b09565b60405180910390f35b3480156102f357600080fd5b5061030e6004803603810190610309919061353d565b610b2f565b60405161031b9190613a5e565b60405180910390f35b34801561033057600080fd5b50610339610bb4565b6040516103469190613b09565b60405180910390f35b34801561035b57600080fd5b5061037660048036038101906103719190613400565b610c42565b005b34801561038457600080fd5b5061038d610d5a565b60405161039a9190613e26565b60405180910390f35b3480156103af57600080fd5b506103b8610d60565b6040516103c59190613e26565b60405180910390f35b3480156103da57600080fd5b506103e3610d6d565b6040516103f09190613e26565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b91906132ea565b610d73565b005b34801561042e57600080fd5b50610437610dd3565b6040516104449190613e26565b60405180910390f35b34801561045957600080fd5b50610474600480360381019061046f919061356a565b610dd9565b604051610482929190613ac5565b60405180910390f35b34801561049757600080fd5b506104a0610e19565b6040516104ad9190613e26565b60405180910390f35b3480156104c257600080fd5b506104dd60048036038101906104d89190613400565b610e1f565b6040516104ea9190613e26565b60405180910390f35b3480156104ff57600080fd5b5061051a60048036038101906105159190613510565b610ec4565b005b610524610fba565b005b34801561053257600080fd5b5061054d600480360381019061054891906132ea565b611076565b005b34801561055b57600080fd5b506105766004803603810190610571919061353d565b611096565b6040516105839190613e26565b60405180910390f35b34801561059857600080fd5b506105a1611107565b6040516105ae9190613aee565b60405180910390f35b3480156105c357600080fd5b506105de60048036038101906105d991906134c7565b61111a565b005b3480156105ec57600080fd5b506105f56111b0565b6040516106029190613e26565b60405180910390f35b34801561061757600080fd5b506106206111b6565b60405161062d9190613aee565b60405180910390f35b34801561064257600080fd5b5061065d6004803603810190610658919061353d565b6111c9565b60405161066a9190613a5e565b60405180910390f35b34801561067f57600080fd5b5061068861127b565b6040516106959190613b09565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190613250565b611309565b6040516106d29190613e26565b60405180910390f35b3480156106e757600080fd5b506106f06113c1565b005b3480156106fe57600080fd5b50610707611449565b6040516107149190613a5e565b60405180910390f35b34801561072957600080fd5b50610732611473565b60405161073f9190613b09565b60405180910390f35b610762600480360381019061075d919061353d565b611505565b005b34801561077057600080fd5b5061078b600480360381019061078691906133c0565b611671565b005b34801561079957600080fd5b506107a2611687565b005b6107be60048036038101906107b9919061353d565b611720565b005b3480156107cc57600080fd5b506107e760048036038101906107e2919061333d565b611896565b005b3480156107f557600080fd5b506107fe6118f8565b60405161080b9190613a5e565b60405180910390f35b34801561082057600080fd5b5061082961191e565b6040516108369190613b09565b60405180910390f35b34801561084b57600080fd5b506108666004803603810190610861919061353d565b6119ac565b6040516108739190613b09565b60405180910390f35b34801561088857600080fd5b50610891611b05565b60405161089e9190613e26565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c991906134c7565b611b0b565b005b3480156108dc57600080fd5b506108f760048036038101906108f291906132aa565b611ba1565b6040516109049190613aee565b60405180910390f35b34801561091957600080fd5b50610922611c35565b60405161092f9190613e0b565b60405180910390f35b34801561094457600080fd5b5061095f600480360381019061095a91906134c7565b611c3b565b005b34801561096d57600080fd5b5061098860048036038101906109839190613250565b611cd1565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109fd57506109fc82611dc9565b5b9050919050565b610a0c611eab565b73ffffffffffffffffffffffffffffffffffffffff16610a2a611449565b73ffffffffffffffffffffffffffffffffffffffff1614610a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7790613d2b565b60405180910390fd5b80601260006101000a81548160ff02191690831515021790555050565b606060008054610aac906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad8906140f9565b8015610b255780601f10610afa57610100808354040283529160200191610b25565b820191906000526020600020905b815481529060010190602001808311610b0857829003601f168201915b5050505050905090565b6000610b3a82611eb3565b610b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7090613d0b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600d8054610bc1906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610bed906140f9565b8015610c3a5780601f10610c0f57610100808354040283529160200191610c3a565b820191906000526020600020905b815481529060010190602001808311610c1d57829003601f168201915b505050505081565b6000610c4d826111c9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb590613d8b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cdd611eab565b73ffffffffffffffffffffffffffffffffffffffff161480610d0c5750610d0b81610d06611eab565b611ba1565b5b610d4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4290613c8b565b60405180910390fd5b610d558383611f1f565b505050565b600e5481565b6000600880549050905090565b60115481565b610d84610d7e611eab565b82611fd8565b610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90613dab565b60405180910390fd5b610dce8383836120b6565b505050565b60105481565b600080306103e861ffff16601260029054906101000a900461ffff1661ffff1685610e049190613fa7565b610e0e9190613f76565b915091509250929050565b600f5481565b6000610e2a83611309565b8210610e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6290613b4b565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ecc611eab565b73ffffffffffffffffffffffffffffffffffffffff16610eea611449565b73ffffffffffffffffffffffffffffffffffffffff1614610f40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3790613d2b565b60405180910390fd5b60008161ffff1610158015610f5b57506103e88161ffff1611155b610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190613c6b565b60405180910390fd5b80601260026101000a81548161ffff021916908361ffff16021790555050565b610fc2611eab565b73ffffffffffffffffffffffffffffffffffffffff16610fe0611449565b73ffffffffffffffffffffffffffffffffffffffff1614611036576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102d90613d2b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061107457600080fd5b565b61109183838360405180602001604052806000815250611896565b505050565b60006110a0610d60565b82106110e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d890613dcb565b60405180910390fd5b600882815481106110f5576110f4614292565b5b90600052602060002001549050919050565b601260019054906101000a900460ff1681565b611122611eab565b73ffffffffffffffffffffffffffffffffffffffff16611140611449565b73ffffffffffffffffffffffffffffffffffffffff1614611196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118d90613d2b565b60405180910390fd5b80600b90805190602001906111ac92919061303a565b5050565b60145481565b601260009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126990613ccb565b60405180910390fd5b80915050919050565b600b8054611288906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546112b4906140f9565b80156113015780601f106112d657610100808354040283529160200191611301565b820191906000526020600020905b8154815290600101906020018083116112e457829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561137a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137190613cab565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113c9611eab565b73ffffffffffffffffffffffffffffffffffffffff166113e7611449565b73ffffffffffffffffffffffffffffffffffffffff161461143d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143490613d2b565b60405180910390fd5b611447600061231d565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611482906140f9565b80601f01602080910402602001604051908101604052809291908181526020018280546114ae906140f9565b80156114fb5780601f106114d0576101008083540402835291602001916114fb565b820191906000526020600020905b8154815290600101906020018083116114de57829003601f168201915b5050505050905090565b601260009054906101000a900460ff161561151f57600080fd5b6000811161152c57600080fd5b8060006115399190613fa7565b34101561154557600080fd5b60115481111561155457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146115c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b990613beb565b60405180910390fd5b601054816015546115d39190613f20565b1115611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160b90613b2b565b60405180910390fd5b6000600190505b818111611659576116463382601554600f546116379190613f20565b6116419190613f20565b6123e3565b80806116519061415c565b91505061161b565b50806015546116689190613f20565b60158190555050565b61168361167c611eab565b8383612401565b5050565b61168f611eab565b73ffffffffffffffffffffffffffffffffffffffff166116ad611449565b73ffffffffffffffffffffffffffffffffffffffff1614611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa90613d2b565b60405180910390fd5b6001601260016101000a81548160ff021916908315150217905550565b600081118015611732575061012c8111155b611771576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176890613d4b565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b81526004016117e39190613e26565b60206040518083038186803b1580156117fb57600080fd5b505afa15801561180f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611833919061327d565b73ffffffffffffffffffffffffffffffffffffffff1614611889576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188090613deb565b60405180910390fd5b61189333826123e3565b50565b6118a76118a1611eab565b83611fd8565b6118e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dd90613dab565b60405180910390fd5b6118f28484848461256e565b50505050565b601260049054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c805461192b906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611957906140f9565b80156119a45780601f10611979576101008083540402835291602001916119a4565b820191906000526020600020905b81548152906001019060200180831161198757829003601f168201915b505050505081565b60606119b782611eb3565b6119f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ed90613d6b565b60405180910390fd5b60001515601260019054906101000a900460ff1615151415611aa457600d8054611a1f906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054611a4b906140f9565b8015611a985780601f10611a6d57610100808354040283529160200191611a98565b820191906000526020600020905b815481529060010190602001808311611a7b57829003601f168201915b50505050509050611b00565b6000611aae6125ca565b90506000815111611ace5760405180602001604052806000815250611afc565b80611ad88461265c565b600c604051602001611aec93929190613a2d565b6040516020818303038152906040525b9150505b919050565b60155481565b611b13611eab565b73ffffffffffffffffffffffffffffffffffffffff16611b31611449565b73ffffffffffffffffffffffffffffffffffffffff1614611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e90613d2b565b60405180910390fd5b80600c9080519060200190611b9d92919061303a565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6103e881565b611c43611eab565b73ffffffffffffffffffffffffffffffffffffffff16611c61611449565b73ffffffffffffffffffffffffffffffffffffffff1614611cb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cae90613d2b565b60405180910390fd5b80600d9080519060200190611ccd92919061303a565b5050565b611cd9611eab565b73ffffffffffffffffffffffffffffffffffffffff16611cf7611449565b73ffffffffffffffffffffffffffffffffffffffff1614611d4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4490613d2b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db490613b8b565b60405180910390fd5b611dc68161231d565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e9457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ea45750611ea3826127bd565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f92836111c9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611fe382611eb3565b612022576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201990613c4b565b60405180910390fd5b600061202d836111c9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061206f575061206e8185611ba1565b5b806120ad57508373ffffffffffffffffffffffffffffffffffffffff1661209584610b2f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166120d6826111c9565b73ffffffffffffffffffffffffffffffffffffffff161461212c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212390613bab565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561219c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219390613c0b565b60405180910390fd5b6121a7838383612827565b6121b2600082611f1f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122029190614001565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122599190613f20565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461231883838361293b565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123fd828260405180602001604052806000815250612940565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246790613c2b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125619190613aee565b60405180910390a3505050565b6125798484846120b6565b6125858484848461299b565b6125c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125bb90613b6b565b60405180910390fd5b50505050565b6060600b80546125d9906140f9565b80601f0160208091040260200160405190810160405280929190818152602001828054612605906140f9565b80156126525780601f1061262757610100808354040283529160200191612652565b820191906000526020600020905b81548152906001019060200180831161263557829003601f168201915b5050505050905090565b606060008214156126a4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127b8565b600082905060005b600082146126d65780806126bf9061415c565b915050600a826126cf9190613f76565b91506126ac565b60008167ffffffffffffffff8111156126f2576126f16142c1565b5b6040519080825280601f01601f1916602001820160405280156127245781602001600182028036833780820191505090505b5090505b600085146127b15760018261273d9190614001565b9150600a8561274c91906141a5565b60306127589190613f20565b60f81b81838151811061276e5761276d614292565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127aa9190613f76565b9450612728565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612832838383612b32565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128755761287081612b37565b6128b4565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128b3576128b28382612b80565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128f7576128f281612ced565b612936565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612935576129348282612dbe565b5b5b505050565b505050565b61294a8383612e3d565b612957600084848461299b565b612996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298d90613b6b565b60405180910390fd5b505050565b60006129bc8473ffffffffffffffffffffffffffffffffffffffff16613017565b15612b25578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129e5611eab565b8786866040518563ffffffff1660e01b8152600401612a079493929190613a79565b602060405180830381600087803b158015612a2157600080fd5b505af1925050508015612a5257506040513d601f19601f82011682018060405250810190612a4f919061349a565b60015b612ad5573d8060008114612a82576040519150601f19603f3d011682016040523d82523d6000602084013e612a87565b606091505b50600081511415612acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ac490613b6b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b2a565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612b8d84611309565b612b979190614001565b9050600060076000848152602001908152602001600020549050818114612c7c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612d019190614001565b9050600060096000848152602001908152602001600020549050600060088381548110612d3157612d30614292565b5b906000526020600020015490508060088381548110612d5357612d52614292565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612da257612da1614263565b5b6001900381819060005260206000200160009055905550505050565b6000612dc983611309565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ead576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ea490613ceb565b60405180910390fd5b612eb681611eb3565b15612ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eed90613bcb565b60405180910390fd5b612f0260008383612827565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f529190613f20565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46130136000838361293b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054613046906140f9565b90600052602060002090601f01602090048101928261306857600085556130af565b82601f1061308157805160ff19168380011785556130af565b828001600101855582156130af579182015b828111156130ae578251825591602001919060010190613093565b5b5090506130bc91906130c0565b5090565b5b808211156130d95760008160009055506001016130c1565b5090565b60006130f06130eb84613e66565b613e41565b90508281526020810184848401111561310c5761310b6142f5565b5b6131178482856140b7565b509392505050565b600061313261312d84613e97565b613e41565b90508281526020810184848401111561314e5761314d6142f5565b5b6131598482856140b7565b509392505050565b60008135905061317081614924565b92915050565b60008151905061318581614924565b92915050565b60008135905061319a8161493b565b92915050565b6000813590506131af81614952565b92915050565b6000815190506131c481614952565b92915050565b600082601f8301126131df576131de6142f0565b5b81356131ef8482602086016130dd565b91505092915050565b600082601f83011261320d5761320c6142f0565b5b813561321d84826020860161311f565b91505092915050565b60008135905061323581614969565b92915050565b60008135905061324a81614980565b92915050565b600060208284031215613266576132656142ff565b5b600061327484828501613161565b91505092915050565b600060208284031215613293576132926142ff565b5b60006132a184828501613176565b91505092915050565b600080604083850312156132c1576132c06142ff565b5b60006132cf85828601613161565b92505060206132e085828601613161565b9150509250929050565b600080600060608486031215613303576133026142ff565b5b600061331186828701613161565b935050602061332286828701613161565b92505060406133338682870161323b565b9150509250925092565b60008060008060808587031215613357576133566142ff565b5b600061336587828801613161565b945050602061337687828801613161565b93505060406133878782880161323b565b925050606085013567ffffffffffffffff8111156133a8576133a76142fa565b5b6133b4878288016131ca565b91505092959194509250565b600080604083850312156133d7576133d66142ff565b5b60006133e585828601613161565b92505060206133f68582860161318b565b9150509250929050565b60008060408385031215613417576134166142ff565b5b600061342585828601613161565b92505060206134368582860161323b565b9150509250929050565b600060208284031215613456576134556142ff565b5b60006134648482850161318b565b91505092915050565b600060208284031215613483576134826142ff565b5b6000613491848285016131a0565b91505092915050565b6000602082840312156134b0576134af6142ff565b5b60006134be848285016131b5565b91505092915050565b6000602082840312156134dd576134dc6142ff565b5b600082013567ffffffffffffffff8111156134fb576134fa6142fa565b5b613507848285016131f8565b91505092915050565b600060208284031215613526576135256142ff565b5b600061353484828501613226565b91505092915050565b600060208284031215613553576135526142ff565b5b60006135618482850161323b565b91505092915050565b60008060408385031215613581576135806142ff565b5b600061358f8582860161323b565b92505060206135a08582860161323b565b9150509250929050565b6135b381614035565b82525050565b6135c281614047565b82525050565b60006135d382613edd565b6135dd8185613ef3565b93506135ed8185602086016140c6565b6135f681614304565b840191505092915050565b600061360c82613ee8565b6136168185613f04565b93506136268185602086016140c6565b61362f81614304565b840191505092915050565b600061364582613ee8565b61364f8185613f15565b935061365f8185602086016140c6565b80840191505092915050565b60008154613678816140f9565b6136828186613f15565b9450600182166000811461369d57600181146136ae576136e1565b60ff198316865281860193506136e1565b6136b785613ec8565b60005b838110156136d9578154818901526001820191506020810190506136ba565b838801955050505b50505092915050565b60006136f7601a83613f04565b915061370282614315565b602082019050919050565b600061371a602b83613f04565b91506137258261433e565b604082019050919050565b600061373d603283613f04565b91506137488261438d565b604082019050919050565b6000613760602683613f04565b915061376b826143dc565b604082019050919050565b6000613783602583613f04565b915061378e8261442b565b604082019050919050565b60006137a6601c83613f04565b91506137b18261447a565b602082019050919050565b60006137c9602583613f04565b91506137d4826144a3565b604082019050919050565b60006137ec602483613f04565b91506137f7826144f2565b604082019050919050565b600061380f601983613f04565b915061381a82614541565b602082019050919050565b6000613832602c83613f04565b915061383d8261456a565b604082019050919050565b6000613855602383613f04565b9150613860826145b9565b604082019050919050565b6000613878603883613f04565b915061388382614608565b604082019050919050565b600061389b602a83613f04565b91506138a682614657565b604082019050919050565b60006138be602983613f04565b91506138c9826146a6565b604082019050919050565b60006138e1602083613f04565b91506138ec826146f5565b602082019050919050565b6000613904602c83613f04565b915061390f8261471e565b604082019050919050565b6000613927602083613f04565b91506139328261476d565b602082019050919050565b600061394a601083613f04565b915061395582614796565b602082019050919050565b600061396d602f83613f04565b9150613978826147bf565b604082019050919050565b6000613990602183613f04565b915061399b8261480e565b604082019050919050565b60006139b3603183613f04565b91506139be8261485d565b604082019050919050565b60006139d6602c83613f04565b91506139e1826148ac565b604082019050919050565b60006139f9601b83613f04565b9150613a04826148fb565b602082019050919050565b613a188161407f565b82525050565b613a27816140ad565b82525050565b6000613a39828661363a565b9150613a45828561363a565b9150613a51828461366b565b9150819050949350505050565b6000602082019050613a7360008301846135aa565b92915050565b6000608082019050613a8e60008301876135aa565b613a9b60208301866135aa565b613aa86040830185613a1e565b8181036060830152613aba81846135c8565b905095945050505050565b6000604082019050613ada60008301856135aa565b613ae76020830184613a1e565b9392505050565b6000602082019050613b0360008301846135b9565b92915050565b60006020820190508181036000830152613b238184613601565b905092915050565b60006020820190508181036000830152613b44816136ea565b9050919050565b60006020820190508181036000830152613b648161370d565b9050919050565b60006020820190508181036000830152613b8481613730565b9050919050565b60006020820190508181036000830152613ba481613753565b9050919050565b60006020820190508181036000830152613bc481613776565b9050919050565b60006020820190508181036000830152613be481613799565b9050919050565b60006020820190508181036000830152613c04816137bc565b9050919050565b60006020820190508181036000830152613c24816137df565b9050919050565b60006020820190508181036000830152613c4481613802565b9050919050565b60006020820190508181036000830152613c6481613825565b9050919050565b60006020820190508181036000830152613c8481613848565b9050919050565b60006020820190508181036000830152613ca48161386b565b9050919050565b60006020820190508181036000830152613cc48161388e565b9050919050565b60006020820190508181036000830152613ce4816138b1565b9050919050565b60006020820190508181036000830152613d04816138d4565b9050919050565b60006020820190508181036000830152613d24816138f7565b9050919050565b60006020820190508181036000830152613d448161391a565b9050919050565b60006020820190508181036000830152613d648161393d565b9050919050565b60006020820190508181036000830152613d8481613960565b9050919050565b60006020820190508181036000830152613da481613983565b9050919050565b60006020820190508181036000830152613dc4816139a6565b9050919050565b60006020820190508181036000830152613de4816139c9565b9050919050565b60006020820190508181036000830152613e04816139ec565b9050919050565b6000602082019050613e206000830184613a0f565b92915050565b6000602082019050613e3b6000830184613a1e565b92915050565b6000613e4b613e5c565b9050613e57828261412b565b919050565b6000604051905090565b600067ffffffffffffffff821115613e8157613e806142c1565b5b613e8a82614304565b9050602081019050919050565b600067ffffffffffffffff821115613eb257613eb16142c1565b5b613ebb82614304565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613f2b826140ad565b9150613f36836140ad565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f6b57613f6a6141d6565b5b828201905092915050565b6000613f81826140ad565b9150613f8c836140ad565b925082613f9c57613f9b614205565b5b828204905092915050565b6000613fb2826140ad565b9150613fbd836140ad565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ff657613ff56141d6565b5b828202905092915050565b600061400c826140ad565b9150614017836140ad565b92508282101561402a576140296141d6565b5b828203905092915050565b60006140408261408d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156140e45780820151818401526020810190506140c9565b838111156140f3576000848401525b50505050565b6000600282049050600182168061411157607f821691505b6020821081141561412557614124614234565b5b50919050565b61413482614304565b810181811067ffffffffffffffff82111715614153576141526142c1565b5b80604052505050565b6000614167826140ad565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561419a576141996141d6565b5b600182019050919050565b60006141b0826140ad565b91506141bb836140ad565b9250826141cb576141ca614205565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f206d6f7265205075626c696320737570706c79206c656674000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43414e4e4f54204d494e54205448524f554748204120435553544f4d20434f4e60008201527f5452414354000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f526f79616c7479206d757374206265206265747765656e20302520616e64203160008201527f30252e0000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4e6f7420746865206f776e6572206f6620746869732050756d70610000000000600082015250565b61492d81614035565b811461493857600080fd5b50565b61494481614047565b811461494f57600080fd5b50565b61495b81614053565b811461496657600080fd5b50565b6149728161407f565b811461497d57600080fd5b50565b614989816140ad565b811461499457600080fd5b5056fea26469706673582212209d4e5ac0a59305bdb6e79611d2dfa07f0004d13973df6f8d7b6c997f5f20216664736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _initBaseURI (string):
Arg [1] : _initNotRevealedUri (string):

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

112798:3565:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76750:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115720:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63569:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65129:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113000:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64652:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113033:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77390:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113148:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65879:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113107:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115801:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;113067:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77058:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;116043:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;116242:114;;;:::i;:::-;;66289:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77580:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113216:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115360:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113487:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113185:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63263:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112932:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62993:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41229:103;;;;;;;;;;;;;:::i;:::-;;40578:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63738:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;114181:576;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65422:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;115287:65;;;;;;;;;;;;;:::i;:::-;;113914:263;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66545:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;113346:72;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;112958:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;114763:497;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113531:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115464:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65648:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;113305:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;115594:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41487:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76750:224;76852:4;76891:35;76876:50;;;:11;:50;;;;:90;;;;76930:36;76954:11;76930:23;:36::i;:::-;76876:90;76869:97;;76750:224;;;:::o;115720:73::-;40809:12;:10;:12::i;:::-;40798:23;;:7;:5;:7::i;:::-;:23;;;40790:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;115781:6:::1;115772;;:15;;;;;;;;;;;;;;;;;;115720:73:::0;:::o;63569:100::-;63623:13;63656:5;63649:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63569:100;:::o;65129:221::-;65205:7;65233:16;65241:7;65233;:16::i;:::-;65225:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;65318:15;:24;65334:7;65318:24;;;;;;;;;;;;;;;;;;;;;65311:31;;65129:221;;;:::o;113000:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;64652:411::-;64733:13;64749:23;64764:7;64749:14;:23::i;:::-;64733:39;;64797:5;64791:11;;:2;:11;;;;64783:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;64891:5;64875:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;64900:37;64917:5;64924:12;:10;:12::i;:::-;64900:16;:37::i;:::-;64875:62;64853:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;65034:21;65043:2;65047:7;65034:8;:21::i;:::-;64722:341;64652:411;;:::o;113033:29::-;;;;:::o;77390:113::-;77451:7;77478:10;:17;;;;77471:24;;77390:113;:::o;113148:32::-;;;;:::o;65879:339::-;66074:41;66093:12;:10;:12::i;:::-;66107:7;66074:18;:41::i;:::-;66066:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;66182:28;66192:4;66198:2;66202:7;66182:9;:28::i;:::-;65879:339;;;:::o;113107:36::-;;;;:::o;115801:236::-;115919:16;115937:21;115992:4;113335;115999:29;;116013:7;;;;;;;;;;;116000:20;;:10;:20;;;;:::i;:::-;115999:29;;;;:::i;:::-;115976:53;;;;115801:236;;;;;:::o;113067:35::-;;;;:::o;77058:256::-;77155:7;77191:23;77208:5;77191:16;:23::i;:::-;77183:5;:31;77175:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;77280:12;:19;77293:5;77280:19;;;;;;;;;;;;;;;:26;77300:5;77280:26;;;;;;;;;;;;77273:33;;77058:256;;;;:::o;116043:193::-;40809:12;:10;:12::i;:::-;40798:23;;:7;:5;:7::i;:::-;:23;;;40790:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;116136:1:::1;116124:8;:13;;;;:33;;;;;116153:4;116141:8;:16;;;;116124:33;116116:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;116220:8;116210:7;;:18;;;;;;;;;;;;;;;;;;116043:193:::0;:::o;116242:114::-;40809:12;:10;:12::i;:::-;40798:23;;:7;:5;:7::i;:::-;:23;;;40790:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;116310:10:::1;116302:24;;:47;116327:21;116302:47;;;;;;;;;;;;;;;;;;;;;;;116294:56;;;::::0;::::1;;116242:114::o:0;66289:185::-;66427:39;66444:4;66450:2;66454:7;66427:39;;;;;;;;;;;;:16;:39::i;:::-;66289:185;;;:::o;77580:233::-;77655:7;77691:30;:28;:30::i;:::-;77683:5;:38;77675:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;77788:10;77799:5;77788:17;;;;;;;;:::i;:::-;;;;;;;;;;77781:24;;77580:233;;;:::o;113216:28::-;;;;;;;;;;;;;:::o;115360:98::-;40809:12;:10;:12::i;:::-;40798:23;;:7;:5;:7::i;:::-;:23;;;40790:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;115441:11:::1;115431:7;:21;;;;;;;;;;;;:::i;:::-;;115360:98:::0;:::o;113487:39::-;;;;:::o;113185:26::-;;;;;;;;;;;;;:::o;63263:239::-;63335:7;63355:13;63371:7;:16;63379:7;63371:16;;;;;;;;;;;;;;;;;;;;;63355:32;;63423:1;63406:19;;:5;:19;;;;63398:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;63489:5;63482:12;;;63263:239;;;:::o;112932:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;62993:208::-;63065:7;63110:1;63093:19;;:5;:19;;;;63085:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;63177:9;:16;63187:5;63177:16;;;;;;;;;;;;;;;;63170:23;;62993:208;;;:::o;41229:103::-;40809:12;:10;:12::i;:::-;40798:23;;:7;:5;:7::i;:::-;:23;;;40790:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41294:30:::1;41321:1;41294:18;:30::i;:::-;41229:103::o:0;40578:87::-;40624:7;40651:6;;;;;;;;;;;40644:13;;40578:87;:::o;63738:104::-;63794:13;63827:7;63820:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63738:104;:::o;114181:576::-;114253:6;;;;;;;;;;;114252:7;114244:16;;;;;;114289:1;114275:11;:15;114267:24;;;;;;114329:11;114319:7;:21;;;;:::i;:::-;114306:9;:34;;114298:43;;;;;;114371:13;;114356:11;:28;;114348:37;;;;;;114414:10;114401:23;;:9;:23;;;114392:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;114517:15;;114502:11;114481:18;;:32;;;;:::i;:::-;:51;;114473:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;114577:9;114589:1;114577:13;;114572:122;114597:11;114592:1;:16;114572:122;;114624:62;114634:10;114684:1;114663:18;;114646:14;;:35;;;;:::i;:::-;:39;;;;:::i;:::-;114624:9;:62::i;:::-;114610:3;;;;;:::i;:::-;;;;114572:122;;;;114742:11;114721:18;;:32;;;;:::i;:::-;114700:18;:53;;;;114181:576;:::o;65422:155::-;65517:52;65536:12;:10;:12::i;:::-;65550:8;65560;65517:18;:52::i;:::-;65422:155;;:::o;115287:65::-;40809:12;:10;:12::i;:::-;40798:23;;:7;:5;:7::i;:::-;:23;;;40790:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;115342:4:::1;115331:8;;:15;;;;;;;;;;;;;;;;;;115287:65::o:0;113914:263::-;114001:1;113991:7;:11;:29;;;;;114017:3;114006:7;:14;;113991:29;113983:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;114090:10;114056:44;;:13;;;;;;;;;;;:21;;;114078:7;114056:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;;;114048:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;114141:30;114151:10;114163:7;114141:9;:30::i;:::-;113914:263;:::o;66545:328::-;66720:41;66739:12;:10;:12::i;:::-;66753:7;66720:18;:41::i;:::-;66712:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;66826:39;66840:4;66846:2;66850:7;66859:5;66826:13;:39::i;:::-;66545:328;;;;:::o;113346:72::-;;;;;;;;;;;;;:::o;112958:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;114763:497::-;114861:13;114902:16;114910:7;114902;:16::i;:::-;114886:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;115011:5;114999:17;;:8;;;;;;;;;;;:17;;;114996:62;;;115036:14;115029:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;114996:62;115066:28;115097:10;:8;:10::i;:::-;115066:41;;115152:1;115127:14;115121:28;:32;:133;;;;;;;;;;;;;;;;;115189:14;115205:18;:7;:16;:18::i;:::-;115225:13;115172:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;115121:133;115114:140;;;114763:497;;;;:::o;113531:34::-;;;;:::o;115464:122::-;40809:12;:10;:12::i;:::-;40798:23;;:7;:5;:7::i;:::-;:23;;;40790:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;115563:17:::1;115547:13;:33;;;;;;;;;;;;:::i;:::-;;115464:122:::0;:::o;65648:164::-;65745:4;65769:18;:25;65788:5;65769:25;;;;;;;;;;;;;;;:35;65795:8;65769:35;;;;;;;;;;;;;;;;;;;;;;;;;65762:42;;65648:164;;;;:::o;113305:34::-;113335:4;113305:34;:::o;115594:120::-;40809:12;:10;:12::i;:::-;40798:23;;:7;:5;:7::i;:::-;:23;;;40790:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;115693:15:::1;115676:14;:32;;;;;;;;;;;;:::i;:::-;;115594:120:::0;:::o;41487:201::-;40809:12;:10;:12::i;:::-;40798:23;;:7;:5;:7::i;:::-;:23;;;40790:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41596:1:::1;41576:22;;:8;:22;;;;41568:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41652:28;41671:8;41652:18;:28::i;:::-;41487:201:::0;:::o;62624:305::-;62726:4;62778:25;62763:40;;;:11;:40;;;;:105;;;;62835:33;62820:48;;;:11;:48;;;;62763:105;:158;;;;62885:36;62909:11;62885:23;:36::i;:::-;62763:158;62743:178;;62624:305;;;:::o;39302:98::-;39355:7;39382:10;39375:17;;39302:98;:::o;68383:127::-;68448:4;68500:1;68472:30;;:7;:16;68480:7;68472:16;;;;;;;;;;;;;;;;;;;;;:30;;;;68465:37;;68383:127;;;:::o;72529:174::-;72631:2;72604:15;:24;72620:7;72604:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;72687:7;72683:2;72649:46;;72658:23;72673:7;72658:14;:23::i;:::-;72649:46;;;;;;;;;;;;72529:174;;:::o;68677:348::-;68770:4;68795:16;68803:7;68795;:16::i;:::-;68787:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;68871:13;68887:23;68902:7;68887:14;:23::i;:::-;68871:39;;68940:5;68929:16;;:7;:16;;;:52;;;;68949:32;68966:5;68973:7;68949:16;:32::i;:::-;68929:52;:87;;;;69009:7;68985:31;;:20;68997:7;68985:11;:20::i;:::-;:31;;;68929:87;68921:96;;;68677:348;;;;:::o;71786:625::-;71945:4;71918:31;;:23;71933:7;71918:14;:23::i;:::-;:31;;;71910:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;72024:1;72010:16;;:2;:16;;;;72002:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;72080:39;72101:4;72107:2;72111:7;72080:20;:39::i;:::-;72184:29;72201:1;72205:7;72184:8;:29::i;:::-;72245:1;72226:9;:15;72236:4;72226:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;72274:1;72257:9;:13;72267:2;72257:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;72305:2;72286:7;:16;72294:7;72286:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;72344:7;72340:2;72325:27;;72334:4;72325:27;;;;;;;;;;;;72365:38;72385:4;72391:2;72395:7;72365:19;:38::i;:::-;71786:625;;;:::o;41848:191::-;41922:16;41941:6;;;;;;;;;;;41922:25;;41967:8;41958:6;;:17;;;;;;;;;;;;;;;;;;42022:8;41991:40;;42012:8;41991:40;;;;;;;;;;;;41911:128;41848:191;:::o;69367:110::-;69443:26;69453:2;69457:7;69443:26;;;;;;;;;;;;:9;:26::i;:::-;69367:110;;:::o;72845:315::-;73000:8;72991:17;;:5;:17;;;;72983:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;73087:8;73049:18;:25;73068:5;73049:25;;;;;;;;;;;;;;;:35;73075:8;73049:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;73133:8;73111:41;;73126:5;73111:41;;;73143:8;73111:41;;;;;;:::i;:::-;;;;;;;;72845:315;;;:::o;67755:::-;67912:28;67922:4;67928:2;67932:7;67912:9;:28::i;:::-;67959:48;67982:4;67988:2;67992:7;68001:5;67959:22;:48::i;:::-;67951:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;67755:315;;;;:::o;113806:102::-;113866:13;113895:7;113888:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;113806:102;:::o;36864:723::-;36920:13;37150:1;37141:5;:10;37137:53;;;37168:10;;;;;;;;;;;;;;;;;;;;;37137:53;37200:12;37215:5;37200:20;;37231:14;37256:78;37271:1;37263:4;:9;37256:78;;37289:8;;;;;:::i;:::-;;;;37320:2;37312:10;;;;;:::i;:::-;;;37256:78;;;37344:19;37376:6;37366:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37344:39;;37394:154;37410:1;37401:5;:10;37394:154;;37438:1;37428:11;;;;;:::i;:::-;;;37505:2;37497:5;:10;;;;:::i;:::-;37484:2;:24;;;;:::i;:::-;37471:39;;37454:6;37461;37454:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;37534:2;37525:11;;;;;:::i;:::-;;;37394:154;;;37572:6;37558:21;;;;;36864:723;;;;:::o;54283:157::-;54368:4;54407:25;54392:40;;;:11;:40;;;;54385:47;;54283:157;;;:::o;78426:589::-;78570:45;78597:4;78603:2;78607:7;78570:26;:45::i;:::-;78648:1;78632:18;;:4;:18;;;78628:187;;;78667:40;78699:7;78667:31;:40::i;:::-;78628:187;;;78737:2;78729:10;;:4;:10;;;78725:90;;78756:47;78789:4;78795:7;78756:32;:47::i;:::-;78725:90;78628:187;78843:1;78829:16;;:2;:16;;;78825:183;;;78862:45;78899:7;78862:36;:45::i;:::-;78825:183;;;78935:4;78929:10;;:2;:10;;;78925:83;;78956:40;78984:2;78988:7;78956:27;:40::i;:::-;78925:83;78825:183;78426:589;;;:::o;75607:125::-;;;;:::o;69704:321::-;69834:18;69840:2;69844:7;69834:5;:18::i;:::-;69885:54;69916:1;69920:2;69924:7;69933:5;69885:22;:54::i;:::-;69863:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;69704:321;;;:::o;73725:799::-;73880:4;73901:15;:2;:13;;;:15::i;:::-;73897:620;;;73953:2;73937:36;;;73974:12;:10;:12::i;:::-;73988:4;73994:7;74003:5;73937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;73933:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74196:1;74179:6;:13;:18;74175:272;;;74222:60;;;;;;;;;;:::i;:::-;;;;;;;;74175:272;74397:6;74391:13;74382:6;74378:2;74374:15;74367:38;73933:529;74070:41;;;74060:51;;;:6;:51;;;;74053:58;;;;;73897:620;74501:4;74494:11;;73725:799;;;;;;;:::o;75096:126::-;;;;:::o;79738:164::-;79842:10;:17;;;;79815:15;:24;79831:7;79815:24;;;;;;;;;;;:44;;;;79870:10;79886:7;79870:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79738:164;:::o;80529:988::-;80795:22;80845:1;80820:22;80837:4;80820:16;:22::i;:::-;:26;;;;:::i;:::-;80795:51;;80857:18;80878:17;:26;80896:7;80878:26;;;;;;;;;;;;80857:47;;81025:14;81011:10;:28;81007:328;;81056:19;81078:12;:18;81091:4;81078:18;;;;;;;;;;;;;;;:34;81097:14;81078:34;;;;;;;;;;;;81056:56;;81162:11;81129:12;:18;81142:4;81129:18;;;;;;;;;;;;;;;:30;81148:10;81129:30;;;;;;;;;;;:44;;;;81279:10;81246:17;:30;81264:11;81246:30;;;;;;;;;;;:43;;;;81041:294;81007:328;81431:17;:26;81449:7;81431:26;;;;;;;;;;;81424:33;;;81475:12;:18;81488:4;81475:18;;;;;;;;;;;;;;;:34;81494:14;81475:34;;;;;;;;;;;81468:41;;;80610:907;;80529:988;;:::o;81812:1079::-;82065:22;82110:1;82090:10;:17;;;;:21;;;;:::i;:::-;82065:46;;82122:18;82143:15;:24;82159:7;82143:24;;;;;;;;;;;;82122:45;;82494:19;82516:10;82527:14;82516:26;;;;;;;;:::i;:::-;;;;;;;;;;82494:48;;82580:11;82555:10;82566;82555:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;82691:10;82660:15;:28;82676:11;82660:28;;;;;;;;;;;:41;;;;82832:15;:24;82848:7;82832:24;;;;;;;;;;;82825:31;;;82867:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;81883:1008;;;81812:1079;:::o;79316:221::-;79401:14;79418:20;79435:2;79418:16;:20::i;:::-;79401:37;;79476:7;79449:12;:16;79462:2;79449:16;;;;;;;;;;;;;;;:24;79466:6;79449:24;;;;;;;;;;;:34;;;;79523:6;79494:17;:26;79512:7;79494:26;;;;;;;;;;;:35;;;;79390:147;79316:221;;:::o;70361:439::-;70455:1;70441:16;;:2;:16;;;;70433:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;70514:16;70522:7;70514;:16::i;:::-;70513:17;70505:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;70576:45;70605:1;70609:2;70613:7;70576:20;:45::i;:::-;70651:1;70634:9;:13;70644:2;70634:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;70682:2;70663:7;:16;70671:7;70663:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;70727:7;70723:2;70702:33;;70719:1;70702:33;;;;;;;;;;;;70748:44;70776:1;70780:2;70784:7;70748:19;:44::i;:::-;70361:439;;:::o;43279:326::-;43339:4;43596:1;43574:7;:19;;;:23;43567:30;;43279:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:143::-;1043:5;1074:6;1068:13;1059:22;;1090:33;1117:5;1090:33;:::i;:::-;986:143;;;;:::o;1135:133::-;1178:5;1216:6;1203:20;1194:29;;1232:30;1256:5;1232:30;:::i;:::-;1135:133;;;;:::o;1274:137::-;1319:5;1357:6;1344:20;1335:29;;1373:32;1399:5;1373:32;:::i;:::-;1274:137;;;;:::o;1417:141::-;1473:5;1504:6;1498:13;1489:22;;1520:32;1546:5;1520:32;:::i;:::-;1417:141;;;;:::o;1577:338::-;1632:5;1681:3;1674:4;1666:6;1662:17;1658:27;1648:122;;1689:79;;:::i;:::-;1648:122;1806:6;1793:20;1831:78;1905:3;1897:6;1890:4;1882:6;1878:17;1831:78;:::i;:::-;1822:87;;1638:277;1577:338;;;;:::o;1935:340::-;1991:5;2040:3;2033:4;2025:6;2021:17;2017:27;2007:122;;2048:79;;:::i;:::-;2007:122;2165:6;2152:20;2190:79;2265:3;2257:6;2250:4;2242:6;2238:17;2190:79;:::i;:::-;2181:88;;1997:278;1935:340;;;;:::o;2281:137::-;2326:5;2364:6;2351:20;2342:29;;2380:32;2406:5;2380:32;:::i;:::-;2281:137;;;;:::o;2424:139::-;2470:5;2508:6;2495:20;2486:29;;2524:33;2551:5;2524:33;:::i;:::-;2424:139;;;;:::o;2569:329::-;2628:6;2677:2;2665:9;2656:7;2652:23;2648:32;2645:119;;;2683:79;;:::i;:::-;2645:119;2803:1;2828:53;2873:7;2864:6;2853:9;2849:22;2828:53;:::i;:::-;2818:63;;2774:117;2569:329;;;;:::o;2904:351::-;2974:6;3023:2;3011:9;3002:7;2998:23;2994:32;2991:119;;;3029:79;;:::i;:::-;2991:119;3149:1;3174:64;3230:7;3221:6;3210:9;3206:22;3174:64;:::i;:::-;3164:74;;3120:128;2904:351;;;;:::o;3261:474::-;3329:6;3337;3386:2;3374:9;3365:7;3361:23;3357:32;3354:119;;;3392:79;;:::i;:::-;3354:119;3512:1;3537:53;3582:7;3573:6;3562:9;3558:22;3537:53;:::i;:::-;3527:63;;3483:117;3639:2;3665:53;3710:7;3701:6;3690:9;3686:22;3665:53;:::i;:::-;3655:63;;3610:118;3261:474;;;;;:::o;3741:619::-;3818:6;3826;3834;3883:2;3871:9;3862:7;3858:23;3854:32;3851:119;;;3889:79;;:::i;:::-;3851:119;4009:1;4034:53;4079:7;4070:6;4059:9;4055:22;4034:53;:::i;:::-;4024:63;;3980:117;4136:2;4162:53;4207:7;4198:6;4187:9;4183:22;4162:53;:::i;:::-;4152:63;;4107:118;4264:2;4290:53;4335:7;4326:6;4315:9;4311:22;4290:53;:::i;:::-;4280:63;;4235:118;3741:619;;;;;:::o;4366:943::-;4461:6;4469;4477;4485;4534:3;4522:9;4513:7;4509:23;4505:33;4502:120;;;4541:79;;:::i;:::-;4502:120;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4916:2;4942:53;4987:7;4978:6;4967:9;4963:22;4942:53;:::i;:::-;4932:63;;4887:118;5072:2;5061:9;5057:18;5044:32;5103:18;5095:6;5092:30;5089:117;;;5125:79;;:::i;:::-;5089:117;5230:62;5284:7;5275:6;5264:9;5260:22;5230:62;:::i;:::-;5220:72;;5015:287;4366:943;;;;;;;:::o;5315:468::-;5380:6;5388;5437:2;5425:9;5416:7;5412:23;5408:32;5405:119;;;5443:79;;:::i;:::-;5405:119;5563:1;5588:53;5633:7;5624:6;5613:9;5609:22;5588:53;:::i;:::-;5578:63;;5534:117;5690:2;5716:50;5758:7;5749:6;5738:9;5734:22;5716:50;:::i;:::-;5706:60;;5661:115;5315:468;;;;;:::o;5789:474::-;5857:6;5865;5914:2;5902:9;5893:7;5889:23;5885:32;5882:119;;;5920:79;;:::i;:::-;5882:119;6040:1;6065:53;6110:7;6101:6;6090:9;6086:22;6065:53;:::i;:::-;6055:63;;6011:117;6167:2;6193:53;6238:7;6229:6;6218:9;6214:22;6193:53;:::i;:::-;6183:63;;6138:118;5789:474;;;;;:::o;6269:323::-;6325:6;6374:2;6362:9;6353:7;6349:23;6345:32;6342:119;;;6380:79;;:::i;:::-;6342:119;6500:1;6525:50;6567:7;6558:6;6547:9;6543:22;6525:50;:::i;:::-;6515:60;;6471:114;6269:323;;;;:::o;6598:327::-;6656:6;6705:2;6693:9;6684:7;6680:23;6676:32;6673:119;;;6711:79;;:::i;:::-;6673:119;6831:1;6856:52;6900:7;6891:6;6880:9;6876:22;6856:52;:::i;:::-;6846:62;;6802:116;6598:327;;;;:::o;6931:349::-;7000:6;7049:2;7037:9;7028:7;7024:23;7020:32;7017:119;;;7055:79;;:::i;:::-;7017:119;7175:1;7200:63;7255:7;7246:6;7235:9;7231:22;7200:63;:::i;:::-;7190:73;;7146:127;6931:349;;;;:::o;7286:509::-;7355:6;7404:2;7392:9;7383:7;7379:23;7375:32;7372:119;;;7410:79;;:::i;:::-;7372:119;7558:1;7547:9;7543:17;7530:31;7588:18;7580:6;7577:30;7574:117;;;7610:79;;:::i;:::-;7574:117;7715:63;7770:7;7761:6;7750:9;7746:22;7715:63;:::i;:::-;7705:73;;7501:287;7286:509;;;;:::o;7801:327::-;7859:6;7908:2;7896:9;7887:7;7883:23;7879:32;7876:119;;;7914:79;;:::i;:::-;7876:119;8034:1;8059:52;8103:7;8094:6;8083:9;8079:22;8059:52;:::i;:::-;8049:62;;8005:116;7801:327;;;;:::o;8134:329::-;8193:6;8242:2;8230:9;8221:7;8217:23;8213:32;8210:119;;;8248:79;;:::i;:::-;8210:119;8368:1;8393:53;8438:7;8429:6;8418:9;8414:22;8393:53;:::i;:::-;8383:63;;8339:117;8134:329;;;;:::o;8469:474::-;8537:6;8545;8594:2;8582:9;8573:7;8569:23;8565:32;8562:119;;;8600:79;;:::i;:::-;8562:119;8720:1;8745:53;8790:7;8781:6;8770:9;8766:22;8745:53;:::i;:::-;8735:63;;8691:117;8847:2;8873:53;8918:7;8909:6;8898:9;8894:22;8873:53;:::i;:::-;8863:63;;8818:118;8469:474;;;;;:::o;8949:118::-;9036:24;9054:5;9036:24;:::i;:::-;9031:3;9024:37;8949:118;;:::o;9073:109::-;9154:21;9169:5;9154:21;:::i;:::-;9149:3;9142:34;9073:109;;:::o;9188:360::-;9274:3;9302:38;9334:5;9302:38;:::i;:::-;9356:70;9419:6;9414:3;9356:70;:::i;:::-;9349:77;;9435:52;9480:6;9475:3;9468:4;9461:5;9457:16;9435:52;:::i;:::-;9512:29;9534:6;9512:29;:::i;:::-;9507:3;9503:39;9496:46;;9278:270;9188:360;;;;:::o;9554:364::-;9642:3;9670:39;9703:5;9670:39;:::i;:::-;9725:71;9789:6;9784:3;9725:71;:::i;:::-;9718:78;;9805:52;9850:6;9845:3;9838:4;9831:5;9827:16;9805:52;:::i;:::-;9882:29;9904:6;9882:29;:::i;:::-;9877:3;9873:39;9866:46;;9646:272;9554:364;;;;:::o;9924:377::-;10030:3;10058:39;10091:5;10058:39;:::i;:::-;10113:89;10195:6;10190:3;10113:89;:::i;:::-;10106:96;;10211:52;10256:6;10251:3;10244:4;10237:5;10233:16;10211:52;:::i;:::-;10288:6;10283:3;10279:16;10272:23;;10034:267;9924:377;;;;:::o;10331:845::-;10434:3;10471:5;10465:12;10500:36;10526:9;10500:36;:::i;:::-;10552:89;10634:6;10629:3;10552:89;:::i;:::-;10545:96;;10672:1;10661:9;10657:17;10688:1;10683:137;;;;10834:1;10829:341;;;;10650:520;;10683:137;10767:4;10763:9;10752;10748:25;10743:3;10736:38;10803:6;10798:3;10794:16;10787:23;;10683:137;;10829:341;10896:38;10928:5;10896:38;:::i;:::-;10956:1;10970:154;10984:6;10981:1;10978:13;10970:154;;;11058:7;11052:14;11048:1;11043:3;11039:11;11032:35;11108:1;11099:7;11095:15;11084:26;;11006:4;11003:1;10999:12;10994:17;;10970:154;;;11153:6;11148:3;11144:16;11137:23;;10836:334;;10650:520;;10438:738;;10331:845;;;;:::o;11182:366::-;11324:3;11345:67;11409:2;11404:3;11345:67;:::i;:::-;11338:74;;11421:93;11510:3;11421:93;:::i;:::-;11539:2;11534:3;11530:12;11523:19;;11182:366;;;:::o;11554:::-;11696:3;11717:67;11781:2;11776:3;11717:67;:::i;:::-;11710:74;;11793:93;11882:3;11793:93;:::i;:::-;11911:2;11906:3;11902:12;11895:19;;11554:366;;;:::o;11926:::-;12068:3;12089:67;12153:2;12148:3;12089:67;:::i;:::-;12082:74;;12165:93;12254:3;12165:93;:::i;:::-;12283:2;12278:3;12274:12;12267:19;;11926:366;;;:::o;12298:::-;12440:3;12461:67;12525:2;12520:3;12461:67;:::i;:::-;12454:74;;12537:93;12626:3;12537:93;:::i;:::-;12655:2;12650:3;12646:12;12639:19;;12298:366;;;:::o;12670:::-;12812:3;12833:67;12897:2;12892:3;12833:67;:::i;:::-;12826:74;;12909:93;12998:3;12909:93;:::i;:::-;13027:2;13022:3;13018:12;13011:19;;12670:366;;;:::o;13042:::-;13184:3;13205:67;13269:2;13264:3;13205:67;:::i;:::-;13198:74;;13281:93;13370:3;13281:93;:::i;:::-;13399:2;13394:3;13390:12;13383:19;;13042:366;;;:::o;13414:::-;13556:3;13577:67;13641:2;13636:3;13577:67;:::i;:::-;13570:74;;13653:93;13742:3;13653:93;:::i;:::-;13771:2;13766:3;13762:12;13755:19;;13414:366;;;:::o;13786:::-;13928:3;13949:67;14013:2;14008:3;13949:67;:::i;:::-;13942:74;;14025:93;14114:3;14025:93;:::i;:::-;14143:2;14138:3;14134:12;14127:19;;13786:366;;;:::o;14158:::-;14300:3;14321:67;14385:2;14380:3;14321:67;:::i;:::-;14314:74;;14397:93;14486:3;14397:93;:::i;:::-;14515:2;14510:3;14506:12;14499:19;;14158:366;;;:::o;14530:::-;14672:3;14693:67;14757:2;14752:3;14693:67;:::i;:::-;14686:74;;14769:93;14858:3;14769:93;:::i;:::-;14887:2;14882:3;14878:12;14871:19;;14530:366;;;:::o;14902:::-;15044:3;15065:67;15129:2;15124:3;15065:67;:::i;:::-;15058:74;;15141:93;15230:3;15141:93;:::i;:::-;15259:2;15254:3;15250:12;15243:19;;14902:366;;;:::o;15274:::-;15416:3;15437:67;15501:2;15496:3;15437:67;:::i;:::-;15430:74;;15513:93;15602:3;15513:93;:::i;:::-;15631:2;15626:3;15622:12;15615:19;;15274:366;;;:::o;15646:::-;15788:3;15809:67;15873:2;15868:3;15809:67;:::i;:::-;15802:74;;15885:93;15974:3;15885:93;:::i;:::-;16003:2;15998:3;15994:12;15987:19;;15646:366;;;:::o;16018:::-;16160:3;16181:67;16245:2;16240:3;16181:67;:::i;:::-;16174:74;;16257:93;16346:3;16257:93;:::i;:::-;16375:2;16370:3;16366:12;16359:19;;16018:366;;;:::o;16390:::-;16532:3;16553:67;16617:2;16612:3;16553:67;:::i;:::-;16546:74;;16629:93;16718:3;16629:93;:::i;:::-;16747:2;16742:3;16738:12;16731:19;;16390:366;;;:::o;16762:::-;16904:3;16925:67;16989:2;16984:3;16925:67;:::i;:::-;16918:74;;17001:93;17090:3;17001:93;:::i;:::-;17119:2;17114:3;17110:12;17103:19;;16762:366;;;:::o;17134:::-;17276:3;17297:67;17361:2;17356:3;17297:67;:::i;:::-;17290:74;;17373:93;17462:3;17373:93;:::i;:::-;17491:2;17486:3;17482:12;17475:19;;17134:366;;;:::o;17506:::-;17648:3;17669:67;17733:2;17728:3;17669:67;:::i;:::-;17662:74;;17745:93;17834:3;17745:93;:::i;:::-;17863:2;17858:3;17854:12;17847:19;;17506:366;;;:::o;17878:::-;18020:3;18041:67;18105:2;18100:3;18041:67;:::i;:::-;18034:74;;18117:93;18206:3;18117:93;:::i;:::-;18235:2;18230:3;18226:12;18219:19;;17878:366;;;:::o;18250:::-;18392:3;18413:67;18477:2;18472:3;18413:67;:::i;:::-;18406:74;;18489:93;18578:3;18489:93;:::i;:::-;18607:2;18602:3;18598:12;18591:19;;18250:366;;;:::o;18622:::-;18764:3;18785:67;18849:2;18844:3;18785:67;:::i;:::-;18778:74;;18861:93;18950:3;18861:93;:::i;:::-;18979:2;18974:3;18970:12;18963:19;;18622:366;;;:::o;18994:::-;19136:3;19157:67;19221:2;19216:3;19157:67;:::i;:::-;19150:74;;19233:93;19322:3;19233:93;:::i;:::-;19351:2;19346:3;19342:12;19335:19;;18994:366;;;:::o;19366:::-;19508:3;19529:67;19593:2;19588:3;19529:67;:::i;:::-;19522:74;;19605:93;19694:3;19605:93;:::i;:::-;19723:2;19718:3;19714:12;19707:19;;19366:366;;;:::o;19738:115::-;19823:23;19840:5;19823:23;:::i;:::-;19818:3;19811:36;19738:115;;:::o;19859:118::-;19946:24;19964:5;19946:24;:::i;:::-;19941:3;19934:37;19859:118;;:::o;19983:589::-;20208:3;20230:95;20321:3;20312:6;20230:95;:::i;:::-;20223:102;;20342:95;20433:3;20424:6;20342:95;:::i;:::-;20335:102;;20454:92;20542:3;20533:6;20454:92;:::i;:::-;20447:99;;20563:3;20556:10;;19983:589;;;;;;:::o;20578:222::-;20671:4;20709:2;20698:9;20694:18;20686:26;;20722:71;20790:1;20779:9;20775:17;20766:6;20722:71;:::i;:::-;20578:222;;;;:::o;20806:640::-;21001:4;21039:3;21028:9;21024:19;21016:27;;21053:71;21121:1;21110:9;21106:17;21097:6;21053:71;:::i;:::-;21134:72;21202:2;21191:9;21187:18;21178:6;21134:72;:::i;:::-;21216;21284:2;21273:9;21269:18;21260:6;21216:72;:::i;:::-;21335:9;21329:4;21325:20;21320:2;21309:9;21305:18;21298:48;21363:76;21434:4;21425:6;21363:76;:::i;:::-;21355:84;;20806:640;;;;;;;:::o;21452:332::-;21573:4;21611:2;21600:9;21596:18;21588:26;;21624:71;21692:1;21681:9;21677:17;21668:6;21624:71;:::i;:::-;21705:72;21773:2;21762:9;21758:18;21749:6;21705:72;:::i;:::-;21452:332;;;;;:::o;21790:210::-;21877:4;21915:2;21904:9;21900:18;21892:26;;21928:65;21990:1;21979:9;21975:17;21966:6;21928:65;:::i;:::-;21790:210;;;;:::o;22006:313::-;22119:4;22157:2;22146:9;22142:18;22134:26;;22206:9;22200:4;22196:20;22192:1;22181:9;22177:17;22170:47;22234:78;22307:4;22298:6;22234:78;:::i;:::-;22226:86;;22006:313;;;;:::o;22325:419::-;22491:4;22529:2;22518:9;22514:18;22506:26;;22578:9;22572:4;22568:20;22564:1;22553:9;22549:17;22542:47;22606:131;22732:4;22606:131;:::i;:::-;22598:139;;22325:419;;;:::o;22750:::-;22916:4;22954:2;22943:9;22939:18;22931:26;;23003:9;22997:4;22993:20;22989:1;22978:9;22974:17;22967:47;23031:131;23157:4;23031:131;:::i;:::-;23023:139;;22750:419;;;:::o;23175:::-;23341:4;23379:2;23368:9;23364:18;23356:26;;23428:9;23422:4;23418:20;23414:1;23403:9;23399:17;23392:47;23456:131;23582:4;23456:131;:::i;:::-;23448:139;;23175:419;;;:::o;23600:::-;23766:4;23804:2;23793:9;23789:18;23781:26;;23853:9;23847:4;23843:20;23839:1;23828:9;23824:17;23817:47;23881:131;24007:4;23881:131;:::i;:::-;23873:139;;23600:419;;;:::o;24025:::-;24191:4;24229:2;24218:9;24214:18;24206:26;;24278:9;24272:4;24268:20;24264:1;24253:9;24249:17;24242:47;24306:131;24432:4;24306:131;:::i;:::-;24298:139;;24025:419;;;:::o;24450:::-;24616:4;24654:2;24643:9;24639:18;24631:26;;24703:9;24697:4;24693:20;24689:1;24678:9;24674:17;24667:47;24731:131;24857:4;24731:131;:::i;:::-;24723:139;;24450:419;;;:::o;24875:::-;25041:4;25079:2;25068:9;25064:18;25056:26;;25128:9;25122:4;25118:20;25114:1;25103:9;25099:17;25092:47;25156:131;25282:4;25156:131;:::i;:::-;25148:139;;24875:419;;;:::o;25300:::-;25466:4;25504:2;25493:9;25489:18;25481:26;;25553:9;25547:4;25543:20;25539:1;25528:9;25524:17;25517:47;25581:131;25707:4;25581:131;:::i;:::-;25573:139;;25300:419;;;:::o;25725:::-;25891:4;25929:2;25918:9;25914:18;25906:26;;25978:9;25972:4;25968:20;25964:1;25953:9;25949:17;25942:47;26006:131;26132:4;26006:131;:::i;:::-;25998:139;;25725:419;;;:::o;26150:::-;26316:4;26354:2;26343:9;26339:18;26331:26;;26403:9;26397:4;26393:20;26389:1;26378:9;26374:17;26367:47;26431:131;26557:4;26431:131;:::i;:::-;26423:139;;26150:419;;;:::o;26575:::-;26741:4;26779:2;26768:9;26764:18;26756:26;;26828:9;26822:4;26818:20;26814:1;26803:9;26799:17;26792:47;26856:131;26982:4;26856:131;:::i;:::-;26848:139;;26575:419;;;:::o;27000:::-;27166:4;27204:2;27193:9;27189:18;27181:26;;27253:9;27247:4;27243:20;27239:1;27228:9;27224:17;27217:47;27281:131;27407:4;27281:131;:::i;:::-;27273:139;;27000:419;;;:::o;27425:::-;27591:4;27629:2;27618:9;27614:18;27606:26;;27678:9;27672:4;27668:20;27664:1;27653:9;27649:17;27642:47;27706:131;27832:4;27706:131;:::i;:::-;27698:139;;27425:419;;;:::o;27850:::-;28016:4;28054:2;28043:9;28039:18;28031:26;;28103:9;28097:4;28093:20;28089:1;28078:9;28074:17;28067:47;28131:131;28257:4;28131:131;:::i;:::-;28123:139;;27850:419;;;:::o;28275:::-;28441:4;28479:2;28468:9;28464:18;28456:26;;28528:9;28522:4;28518:20;28514:1;28503:9;28499:17;28492:47;28556:131;28682:4;28556:131;:::i;:::-;28548:139;;28275:419;;;:::o;28700:::-;28866:4;28904:2;28893:9;28889:18;28881:26;;28953:9;28947:4;28943:20;28939:1;28928:9;28924:17;28917:47;28981:131;29107:4;28981:131;:::i;:::-;28973:139;;28700:419;;;:::o;29125:::-;29291:4;29329:2;29318:9;29314:18;29306:26;;29378:9;29372:4;29368:20;29364:1;29353:9;29349:17;29342:47;29406:131;29532:4;29406:131;:::i;:::-;29398:139;;29125:419;;;:::o;29550:::-;29716:4;29754:2;29743:9;29739:18;29731:26;;29803:9;29797:4;29793:20;29789:1;29778:9;29774:17;29767:47;29831:131;29957:4;29831:131;:::i;:::-;29823:139;;29550:419;;;:::o;29975:::-;30141:4;30179:2;30168:9;30164:18;30156:26;;30228:9;30222:4;30218:20;30214:1;30203:9;30199:17;30192:47;30256:131;30382:4;30256:131;:::i;:::-;30248:139;;29975:419;;;:::o;30400:::-;30566:4;30604:2;30593:9;30589:18;30581:26;;30653:9;30647:4;30643:20;30639:1;30628:9;30624:17;30617:47;30681:131;30807:4;30681:131;:::i;:::-;30673:139;;30400:419;;;:::o;30825:::-;30991:4;31029:2;31018:9;31014:18;31006:26;;31078:9;31072:4;31068:20;31064:1;31053:9;31049:17;31042:47;31106:131;31232:4;31106:131;:::i;:::-;31098:139;;30825:419;;;:::o;31250:::-;31416:4;31454:2;31443:9;31439:18;31431:26;;31503:9;31497:4;31493:20;31489:1;31478:9;31474:17;31467:47;31531:131;31657:4;31531:131;:::i;:::-;31523:139;;31250:419;;;:::o;31675:::-;31841:4;31879:2;31868:9;31864:18;31856:26;;31928:9;31922:4;31918:20;31914:1;31903:9;31899:17;31892:47;31956:131;32082:4;31956:131;:::i;:::-;31948:139;;31675:419;;;:::o;32100:218::-;32191:4;32229:2;32218:9;32214:18;32206:26;;32242:69;32308:1;32297:9;32293:17;32284:6;32242:69;:::i;:::-;32100:218;;;;:::o;32324:222::-;32417:4;32455:2;32444:9;32440:18;32432:26;;32468:71;32536:1;32525:9;32521:17;32512:6;32468:71;:::i;:::-;32324:222;;;;:::o;32552:129::-;32586:6;32613:20;;:::i;:::-;32603:30;;32642:33;32670:4;32662:6;32642:33;:::i;:::-;32552:129;;;:::o;32687:75::-;32720:6;32753:2;32747:9;32737:19;;32687:75;:::o;32768:307::-;32829:4;32919:18;32911:6;32908:30;32905:56;;;32941:18;;:::i;:::-;32905:56;32979:29;33001:6;32979:29;:::i;:::-;32971:37;;33063:4;33057;33053:15;33045:23;;32768:307;;;:::o;33081:308::-;33143:4;33233:18;33225:6;33222:30;33219:56;;;33255:18;;:::i;:::-;33219:56;33293:29;33315:6;33293:29;:::i;:::-;33285:37;;33377:4;33371;33367:15;33359:23;;33081:308;;;:::o;33395:141::-;33444:4;33467:3;33459:11;;33490:3;33487:1;33480:14;33524:4;33521:1;33511:18;33503:26;;33395:141;;;:::o;33542:98::-;33593:6;33627:5;33621:12;33611:22;;33542:98;;;:::o;33646:99::-;33698:6;33732:5;33726:12;33716:22;;33646:99;;;:::o;33751:168::-;33834:11;33868:6;33863:3;33856:19;33908:4;33903:3;33899:14;33884:29;;33751:168;;;;:::o;33925:169::-;34009:11;34043:6;34038:3;34031:19;34083:4;34078:3;34074:14;34059:29;;33925:169;;;;:::o;34100:148::-;34202:11;34239:3;34224:18;;34100:148;;;;:::o;34254:305::-;34294:3;34313:20;34331:1;34313:20;:::i;:::-;34308:25;;34347:20;34365:1;34347:20;:::i;:::-;34342:25;;34501:1;34433:66;34429:74;34426:1;34423:81;34420:107;;;34507:18;;:::i;:::-;34420:107;34551:1;34548;34544:9;34537:16;;34254:305;;;;:::o;34565:185::-;34605:1;34622:20;34640:1;34622:20;:::i;:::-;34617:25;;34656:20;34674:1;34656:20;:::i;:::-;34651:25;;34695:1;34685:35;;34700:18;;:::i;:::-;34685:35;34742:1;34739;34735:9;34730:14;;34565:185;;;;:::o;34756:348::-;34796:7;34819:20;34837:1;34819:20;:::i;:::-;34814:25;;34853:20;34871:1;34853:20;:::i;:::-;34848:25;;35041:1;34973:66;34969:74;34966:1;34963:81;34958:1;34951:9;34944:17;34940:105;34937:131;;;35048:18;;:::i;:::-;34937:131;35096:1;35093;35089:9;35078:20;;34756:348;;;;:::o;35110:191::-;35150:4;35170:20;35188:1;35170:20;:::i;:::-;35165:25;;35204:20;35222:1;35204:20;:::i;:::-;35199:25;;35243:1;35240;35237:8;35234:34;;;35248:18;;:::i;:::-;35234:34;35293:1;35290;35286:9;35278:17;;35110:191;;;;:::o;35307:96::-;35344:7;35373:24;35391:5;35373:24;:::i;:::-;35362:35;;35307:96;;;:::o;35409:90::-;35443:7;35486:5;35479:13;35472:21;35461:32;;35409:90;;;:::o;35505:149::-;35541:7;35581:66;35574:5;35570:78;35559:89;;35505:149;;;:::o;35660:89::-;35696:7;35736:6;35729:5;35725:18;35714:29;;35660:89;;;:::o;35755:126::-;35792:7;35832:42;35825:5;35821:54;35810:65;;35755:126;;;:::o;35887:77::-;35924:7;35953:5;35942:16;;35887:77;;;:::o;35970:154::-;36054:6;36049:3;36044;36031:30;36116:1;36107:6;36102:3;36098:16;36091:27;35970:154;;;:::o;36130:307::-;36198:1;36208:113;36222:6;36219:1;36216:13;36208:113;;;36307:1;36302:3;36298:11;36292:18;36288:1;36283:3;36279:11;36272:39;36244:2;36241:1;36237:10;36232:15;;36208:113;;;36339:6;36336:1;36333:13;36330:101;;;36419:1;36410:6;36405:3;36401:16;36394:27;36330:101;36179:258;36130:307;;;:::o;36443:320::-;36487:6;36524:1;36518:4;36514:12;36504:22;;36571:1;36565:4;36561:12;36592:18;36582:81;;36648:4;36640:6;36636:17;36626:27;;36582:81;36710:2;36702:6;36699:14;36679:18;36676:38;36673:84;;;36729:18;;:::i;:::-;36673:84;36494:269;36443:320;;;:::o;36769:281::-;36852:27;36874:4;36852:27;:::i;:::-;36844:6;36840:40;36982:6;36970:10;36967:22;36946:18;36934:10;36931:34;36928:62;36925:88;;;36993:18;;:::i;:::-;36925:88;37033:10;37029:2;37022:22;36812:238;36769:281;;:::o;37056:233::-;37095:3;37118:24;37136:5;37118:24;:::i;:::-;37109:33;;37164:66;37157:5;37154:77;37151:103;;;37234:18;;:::i;:::-;37151:103;37281:1;37274:5;37270:13;37263:20;;37056:233;;;:::o;37295:176::-;37327:1;37344:20;37362:1;37344:20;:::i;:::-;37339:25;;37378:20;37396:1;37378:20;:::i;:::-;37373:25;;37417:1;37407:35;;37422:18;;:::i;:::-;37407:35;37463:1;37460;37456:9;37451:14;;37295:176;;;;:::o;37477:180::-;37525:77;37522:1;37515:88;37622:4;37619:1;37612:15;37646:4;37643:1;37636:15;37663:180;37711:77;37708:1;37701:88;37808:4;37805:1;37798:15;37832:4;37829:1;37822:15;37849:180;37897:77;37894:1;37887:88;37994:4;37991:1;37984:15;38018:4;38015:1;38008:15;38035:180;38083:77;38080:1;38073:88;38180:4;38177:1;38170:15;38204:4;38201:1;38194:15;38221:180;38269:77;38266:1;38259:88;38366:4;38363:1;38356:15;38390:4;38387:1;38380:15;38407:180;38455:77;38452:1;38445:88;38552:4;38549:1;38542:15;38576:4;38573:1;38566:15;38593:117;38702:1;38699;38692:12;38716:117;38825:1;38822;38815:12;38839:117;38948:1;38945;38938:12;38962:117;39071:1;39068;39061:12;39085:102;39126:6;39177:2;39173:7;39168:2;39161:5;39157:14;39153:28;39143:38;;39085:102;;;:::o;39193:176::-;39333:28;39329:1;39321:6;39317:14;39310:52;39193:176;:::o;39375:230::-;39515:34;39511:1;39503:6;39499:14;39492:58;39584:13;39579:2;39571:6;39567:15;39560:38;39375:230;:::o;39611:237::-;39751:34;39747:1;39739:6;39735:14;39728:58;39820:20;39815:2;39807:6;39803:15;39796:45;39611:237;:::o;39854:225::-;39994:34;39990:1;39982:6;39978:14;39971:58;40063:8;40058:2;40050:6;40046:15;40039:33;39854:225;:::o;40085:224::-;40225:34;40221:1;40213:6;40209:14;40202:58;40294:7;40289:2;40281:6;40277:15;40270:32;40085:224;:::o;40315:178::-;40455:30;40451:1;40443:6;40439:14;40432:54;40315:178;:::o;40499:224::-;40639:34;40635:1;40627:6;40623:14;40616:58;40708:7;40703:2;40695:6;40691:15;40684:32;40499:224;:::o;40729:223::-;40869:34;40865:1;40857:6;40853:14;40846:58;40938:6;40933:2;40925:6;40921:15;40914:31;40729:223;:::o;40958:175::-;41098:27;41094:1;41086:6;41082:14;41075:51;40958:175;:::o;41139:231::-;41279:34;41275:1;41267:6;41263:14;41256:58;41348:14;41343:2;41335:6;41331:15;41324:39;41139:231;:::o;41376:222::-;41516:34;41512:1;41504:6;41500:14;41493:58;41585:5;41580:2;41572:6;41568:15;41561:30;41376:222;:::o;41604:243::-;41744:34;41740:1;41732:6;41728:14;41721:58;41813:26;41808:2;41800:6;41796:15;41789:51;41604:243;:::o;41853:229::-;41993:34;41989:1;41981:6;41977:14;41970:58;42062:12;42057:2;42049:6;42045:15;42038:37;41853:229;:::o;42088:228::-;42228:34;42224:1;42216:6;42212:14;42205:58;42297:11;42292:2;42284:6;42280:15;42273:36;42088:228;:::o;42322:182::-;42462:34;42458:1;42450:6;42446:14;42439:58;42322:182;:::o;42510:231::-;42650:34;42646:1;42638:6;42634:14;42627:58;42719:14;42714:2;42706:6;42702:15;42695:39;42510:231;:::o;42747:182::-;42887:34;42883:1;42875:6;42871:14;42864:58;42747:182;:::o;42935:166::-;43075:18;43071:1;43063:6;43059:14;43052:42;42935:166;:::o;43107:234::-;43247:34;43243:1;43235:6;43231:14;43224:58;43316:17;43311:2;43303:6;43299:15;43292:42;43107:234;:::o;43347:220::-;43487:34;43483:1;43475:6;43471:14;43464:58;43556:3;43551:2;43543:6;43539:15;43532:28;43347:220;:::o;43573:236::-;43713:34;43709:1;43701:6;43697:14;43690:58;43782:19;43777:2;43769:6;43765:15;43758:44;43573:236;:::o;43815:231::-;43955:34;43951:1;43943:6;43939:14;43932:58;44024:14;44019:2;44011:6;44007:15;44000:39;43815:231;:::o;44052:177::-;44192:29;44188:1;44180:6;44176:14;44169:53;44052:177;:::o;44235:122::-;44308:24;44326:5;44308:24;:::i;:::-;44301:5;44298:35;44288:63;;44347:1;44344;44337:12;44288:63;44235:122;:::o;44363:116::-;44433:21;44448:5;44433:21;:::i;:::-;44426:5;44423:32;44413:60;;44469:1;44466;44459:12;44413:60;44363:116;:::o;44485:120::-;44557:23;44574:5;44557:23;:::i;:::-;44550:5;44547:34;44537:62;;44595:1;44592;44585:12;44537:62;44485:120;:::o;44611:::-;44683:23;44700:5;44683:23;:::i;:::-;44676:5;44673:34;44663:62;;44721:1;44718;44711:12;44663:62;44611:120;:::o;44737:122::-;44810:24;44828:5;44810:24;:::i;:::-;44803:5;44800:35;44790:63;;44849:1;44846;44839:12;44790:63;44737:122;:::o

Swarm Source

ipfs://9d4e5ac0a59305bdb6e79611d2dfa07f0004d13973df6f8d7b6c997f5f202166
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.