Repository: walmat/nebula Branch: main Commit: 176ae287cbf8 Files: 634 Total size: 10.6 MB Directory structure: gitextract_l8lb8z_d/ ├── .eslintignore ├── .eslintrc.js ├── .gitattributes ├── .github/ │ └── ISSUE_TEMPLATE/ │ ├── bug_report.md │ └── feature_request.md ├── .gitignore ├── .prettierrc ├── .stylelintrc ├── app/ │ ├── 3ds.html │ ├── Harvester.html │ ├── Question.html │ ├── __mocks__/ │ │ ├── dns.tsx │ │ ├── electron-ga.tsx │ │ ├── electron.tsx │ │ ├── fileMock.tsx │ │ ├── request-promise.tsx │ │ └── styleMock.tsx │ ├── api/ │ │ └── sys/ │ │ ├── fileOps.ts │ │ └── index.ts │ ├── app.html │ ├── auth.html │ ├── classes/ │ │ ├── AppUpdate.ts │ │ ├── Boot.ts │ │ ├── Notification.ts │ │ ├── ProxyTester.ts │ │ └── Storage.ts │ ├── components/ │ │ ├── Analytics/ │ │ │ ├── Loadable.tsx │ │ │ ├── __tests__/ │ │ │ │ └── Analytics.spec.tsx │ │ │ ├── actions/ │ │ │ │ ├── checkouts.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── news.tsx │ │ │ ├── components/ │ │ │ │ ├── checkouts.tsx │ │ │ │ ├── expenses.tsx │ │ │ │ ├── news.tsx │ │ │ │ ├── orders.tsx │ │ │ │ ├── stats.tsx │ │ │ │ └── welcome.tsx │ │ │ ├── index.tsx │ │ │ ├── reducers/ │ │ │ │ ├── checkouts.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── news.tsx │ │ │ ├── styles/ │ │ │ │ ├── checkouts.tsx │ │ │ │ ├── expenses.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── news.tsx │ │ │ │ ├── orders.tsx │ │ │ │ ├── shipments.tsx │ │ │ │ ├── stats.tsx │ │ │ │ └── welcome.tsx │ │ │ └── types.tsx │ │ ├── App/ │ │ │ ├── App.tsx │ │ │ ├── Providers.tsx │ │ │ ├── Root.tsx │ │ │ ├── __tests__/ │ │ │ │ ├── App.spec.tsx │ │ │ │ └── Root.spec.tsx │ │ │ ├── actions.tsx │ │ │ ├── components/ │ │ │ │ ├── titlebar/ │ │ │ │ │ └── Titlebar.tsx │ │ │ │ └── toolbar/ │ │ │ │ ├── area.tsx │ │ │ │ ├── body.tsx │ │ │ │ ├── menu.tsx │ │ │ │ └── profile.tsx │ │ │ ├── reducers.tsx │ │ │ ├── selectors.tsx │ │ │ └── styles/ │ │ │ ├── Titlebar.tsx │ │ │ ├── ToolbarAreaPane.tsx │ │ │ └── index.tsx │ │ ├── Calendar/ │ │ │ ├── Calendar.tsx │ │ │ ├── CalendarMonth.tsx │ │ │ ├── CalendarYear.tsx │ │ │ ├── Container.tsx │ │ │ ├── Month.tsx │ │ │ └── ViewSelect.tsx │ │ ├── Captchas/ │ │ │ ├── Harvesters.tsx │ │ │ ├── Loadable.tsx │ │ │ ├── __tests__/ │ │ │ │ └── Harvesters.spec.tsx │ │ │ ├── actions/ │ │ │ │ ├── captchas.tsx │ │ │ │ └── index.tsx │ │ │ ├── components/ │ │ │ │ ├── actionBar/ │ │ │ │ │ └── ActionBar.tsx │ │ │ │ ├── card/ │ │ │ │ │ └── index.tsx │ │ │ │ └── grid/ │ │ │ │ └── index.tsx │ │ │ ├── reducers/ │ │ │ │ ├── captchas.tsx │ │ │ │ └── index.tsx │ │ │ ├── selectors.tsx │ │ │ └── styles/ │ │ │ ├── actionBar.tsx │ │ │ ├── card.tsx │ │ │ ├── createDialog.tsx │ │ │ └── index.tsx │ │ ├── DebouncedInput/ │ │ │ └── DebouncedInput.tsx │ │ ├── ErrorBoundary/ │ │ │ ├── components/ │ │ │ │ ├── GenerateErrorReport.tsx │ │ │ │ └── GenerateErrorReportBody.tsx │ │ │ ├── index.tsx │ │ │ └── styles/ │ │ │ ├── GenerateErrorReport.tsx │ │ │ └── index.tsx │ │ ├── ImportExport/ │ │ │ ├── components/ │ │ │ │ └── dialog.tsx │ │ │ ├── index.tsx │ │ │ └── styles/ │ │ │ └── index.tsx │ │ ├── Legal/ │ │ │ ├── PrivacyPolicy/ │ │ │ │ ├── Loadable.tsx │ │ │ │ ├── __tests__/ │ │ │ │ │ └── PrivacyPolicy.spec.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── styles/ │ │ │ │ └── index.tsx │ │ │ └── TermsOfService/ │ │ │ ├── Loadable.tsx │ │ │ ├── __tests__/ │ │ │ │ └── TermsOfService.spec.tsx │ │ │ ├── index.tsx │ │ │ └── styles/ │ │ │ └── index.tsx │ │ ├── LoadingIndicator/ │ │ │ ├── index.tsx │ │ │ └── styles/ │ │ │ └── index.tsx │ │ ├── NoChildrenComponent/ │ │ │ ├── index.tsx │ │ │ └── styles/ │ │ │ └── index.tsx │ │ ├── Profiles/ │ │ │ ├── Loadable.tsx │ │ │ ├── Profiles.tsx │ │ │ ├── __tests__/ │ │ │ │ └── Profiles.spec.tsx │ │ │ ├── actions/ │ │ │ │ ├── index.tsx │ │ │ │ └── profiles.tsx │ │ │ ├── components/ │ │ │ │ ├── actionBar/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── card/ │ │ │ │ │ └── index.tsx │ │ │ │ ├── create/ │ │ │ │ │ ├── ProfileCreateDialog.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── ProfileCreateDialog.spec.tsx │ │ │ │ │ ├── billing.tsx │ │ │ │ │ ├── payment.tsx │ │ │ │ │ └── shipping.tsx │ │ │ │ └── grid/ │ │ │ │ └── index.tsx │ │ │ ├── reducers/ │ │ │ │ ├── current.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── location.tsx │ │ │ │ ├── payment.tsx │ │ │ │ └── profiles.tsx │ │ │ ├── selectors.tsx │ │ │ └── styles/ │ │ │ ├── actionBar.tsx │ │ │ ├── card.tsx │ │ │ ├── createDialog.tsx │ │ │ └── index.tsx │ │ ├── Progressbar/ │ │ │ ├── Loadable.tsx │ │ │ ├── index.tsx │ │ │ └── styles/ │ │ │ └── index.tsx │ │ ├── Proxies/ │ │ │ ├── Loadable.tsx │ │ │ ├── Proxies.tsx │ │ │ ├── __tests__/ │ │ │ │ └── Proxies.spec.tsx │ │ │ ├── actions/ │ │ │ │ └── index.tsx │ │ │ ├── components/ │ │ │ │ ├── ProxyActionBar.tsx │ │ │ │ ├── ProxyCreateDialog.tsx │ │ │ │ ├── Table/ │ │ │ │ │ ├── ProxyTable.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── tableHead.tsx │ │ │ │ │ │ ├── tableRow.tsx │ │ │ │ │ │ └── tableToolbar.tsx │ │ │ │ │ └── styles/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── tableToolbar.tsx │ │ │ │ └── __tests__/ │ │ │ │ └── ProxyCreateDialog.spec.tsx │ │ │ ├── reducers/ │ │ │ │ ├── current.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── proxies.tsx │ │ │ ├── selectors.tsx │ │ │ └── styles/ │ │ │ ├── actionBar.tsx │ │ │ ├── createDialog.tsx │ │ │ └── index.tsx │ │ ├── ReportBugs/ │ │ │ ├── Loadable.tsx │ │ │ ├── __tests__/ │ │ │ │ └── ReportBugs.spec.tsx │ │ │ ├── index.tsx │ │ │ └── styles/ │ │ │ └── index.tsx │ │ ├── Settings/ │ │ │ ├── actions.tsx │ │ │ ├── components/ │ │ │ │ └── dialog/ │ │ │ │ ├── ProductField.tsx │ │ │ │ ├── ProfileField.tsx │ │ │ │ ├── StoreField.tsx │ │ │ │ ├── accounts.tsx │ │ │ │ ├── defaults.tsx │ │ │ │ ├── generics.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── rates.tsx │ │ │ │ └── webhooks.tsx │ │ │ ├── index.tsx │ │ │ ├── reducers/ │ │ │ │ ├── accounts.tsx │ │ │ │ ├── currentAccount.tsx │ │ │ │ ├── currentWebhook.tsx │ │ │ │ ├── defaults.tsx │ │ │ │ ├── index.tsx │ │ │ │ ├── rates.ts │ │ │ │ ├── settings.tsx │ │ │ │ └── webhooks.tsx │ │ │ ├── selectors.tsx │ │ │ └── styles/ │ │ │ └── index.tsx │ │ ├── Sidebar/ │ │ │ ├── Sidebar.tsx │ │ │ ├── __tests__/ │ │ │ │ └── Sidebar.spec.tsx │ │ │ ├── components/ │ │ │ │ ├── AnimatedLogo.tsx │ │ │ │ ├── icons.tsx │ │ │ │ └── menuItems.tsx │ │ │ └── styles/ │ │ │ └── index.tsx │ │ ├── Tasks/ │ │ │ ├── Loadable.tsx │ │ │ ├── Tasks.tsx │ │ │ ├── __tests__/ │ │ │ │ └── Tasks.spec.tsx │ │ │ ├── actions/ │ │ │ │ └── index.tsx │ │ │ ├── components/ │ │ │ │ ├── Table/ │ │ │ │ │ ├── TableData.tsx │ │ │ │ │ ├── TableWrapper.tsx │ │ │ │ │ ├── TaskList.tsx │ │ │ │ │ ├── components/ │ │ │ │ │ │ ├── TableBodyWrapper.tsx │ │ │ │ │ │ ├── TableHeader.tsx │ │ │ │ │ │ ├── cells/ │ │ │ │ │ │ │ ├── checkbox.tsx │ │ │ │ │ │ │ ├── product.tsx │ │ │ │ │ │ │ ├── profile.tsx │ │ │ │ │ │ │ ├── proxies.tsx │ │ │ │ │ │ │ ├── sizes.tsx │ │ │ │ │ │ │ ├── status.tsx │ │ │ │ │ │ │ ├── store.tsx │ │ │ │ │ │ │ └── taskId.tsx │ │ │ │ │ │ ├── header/ │ │ │ │ │ │ │ ├── checkbox.tsx │ │ │ │ │ │ │ ├── product.tsx │ │ │ │ │ │ │ ├── profile.tsx │ │ │ │ │ │ │ ├── proxies.tsx │ │ │ │ │ │ │ ├── sizes.tsx │ │ │ │ │ │ │ ├── status.tsx │ │ │ │ │ │ │ ├── store.tsx │ │ │ │ │ │ │ └── taskId.tsx │ │ │ │ │ │ ├── icons.tsx │ │ │ │ │ │ ├── tableRow.tsx │ │ │ │ │ │ ├── tableToolbar.tsx │ │ │ │ │ │ └── toolbar/ │ │ │ │ │ │ ├── clock.tsx │ │ │ │ │ │ ├── filter.tsx │ │ │ │ │ │ ├── groups.tsx │ │ │ │ │ │ ├── monitor.tsx │ │ │ │ │ │ ├── retry.tsx │ │ │ │ │ │ └── stagger.tsx │ │ │ │ │ └── styles/ │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── tableToolbar.tsx │ │ │ │ ├── actionBar/ │ │ │ │ │ ├── actionBar.tsx │ │ │ │ │ ├── copyBtn.tsx │ │ │ │ │ ├── createBtn.tsx │ │ │ │ │ ├── deleteBtn.tsx │ │ │ │ │ ├── editBtn.tsx │ │ │ │ │ ├── startBtn.tsx │ │ │ │ │ └── stopBtn.tsx │ │ │ │ ├── create/ │ │ │ │ │ ├── AccountField.tsx │ │ │ │ │ ├── CaptchaField.tsx │ │ │ │ │ ├── CategoryField.tsx │ │ │ │ │ ├── CheckoutDelayField.tsx │ │ │ │ │ ├── DateField.tsx │ │ │ │ │ ├── DiscountField.tsx │ │ │ │ │ ├── FootsiteForm.tsx │ │ │ │ │ ├── MaxPriceField.tsx │ │ │ │ │ ├── MinPriceField.tsx │ │ │ │ │ ├── MockToggle.tsx │ │ │ │ │ ├── NumberOfTasksField.tsx │ │ │ │ │ ├── OneCheckout.tsx │ │ │ │ │ ├── PasswordField.tsx │ │ │ │ │ ├── PayPalField.tsx │ │ │ │ │ ├── PokemonForm.tsx │ │ │ │ │ ├── ProductField.tsx │ │ │ │ │ ├── ProfileField.tsx │ │ │ │ │ ├── ProxiesField.tsx │ │ │ │ │ ├── QuantityField.tsx │ │ │ │ │ ├── RatesField.tsx │ │ │ │ │ ├── RestockMode.tsx │ │ │ │ │ ├── SecureBypassField.tsx │ │ │ │ │ ├── ShopifyForm.tsx │ │ │ │ │ ├── SizesField.tsx │ │ │ │ │ ├── StoreField.tsx │ │ │ │ │ ├── StyleIdField.tsx │ │ │ │ │ ├── SupremeForm.tsx │ │ │ │ │ ├── TaskCreateDialog.tsx │ │ │ │ │ ├── TaskForm.tsx │ │ │ │ │ ├── TaskModeField.tsx │ │ │ │ │ ├── UseRotateProxies.tsx │ │ │ │ │ ├── VariationField.tsx │ │ │ │ │ ├── YeezySupplyForm.tsx │ │ │ │ │ ├── __tests__/ │ │ │ │ │ │ └── TaskCreateDialog.spec.tsx │ │ │ │ │ ├── clearBtn.tsx │ │ │ │ │ ├── closeBtn.tsx │ │ │ │ │ └── createBtn.tsx │ │ │ │ └── edits/ │ │ │ │ └── TaskEditDialog.tsx │ │ │ ├── reducers/ │ │ │ │ ├── current.tsx │ │ │ │ ├── delays.tsx │ │ │ │ ├── edits.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── tasks.tsx │ │ │ ├── selectors.tsx │ │ │ ├── styles/ │ │ │ │ ├── actionBar.tsx │ │ │ │ ├── createDialog.tsx │ │ │ │ └── index.tsx │ │ │ └── useTaskKeyPress.tsx │ │ ├── featureFlag/ │ │ │ ├── FeatureFlagContext.tsx │ │ │ └── NebulaFeatureFlags.ts │ │ └── ui/ │ │ ├── Select.tsx │ │ └── table/ │ │ ├── IndeterminateCheckbox.tsx │ │ ├── RenderRow.tsx │ │ ├── RowTable.tsx │ │ ├── Table.tsx │ │ ├── TableCell.tsx │ │ └── TableVirtualized.tsx │ ├── constants/ │ │ ├── countries.json │ │ ├── env.js │ │ ├── index.ts │ │ ├── ipc.ts │ │ ├── meta.js │ │ ├── regexes.js │ │ └── sizes.js │ ├── hooks/ │ │ ├── useAnalyticsFile.tsx │ │ ├── useAutoSolveLifecycle.tsx │ │ ├── useAutoUpdateLifecycle.tsx │ │ ├── useEscape.tsx │ │ ├── useInterval.ts │ │ ├── useNotificationLifecycle.tsx │ │ ├── useProxiesStatus.tsx │ │ ├── useQuickTaskLifecycle.tsx │ │ ├── useTaskLifecycle.tsx │ │ ├── useTaskStatus.tsx │ │ ├── useTraceUpdate.ts │ │ ├── useUpdateProfiles.tsx │ │ ├── useUpdateProxies.tsx │ │ ├── useUpdateStagger.tsx │ │ ├── useUpdateWebhooks.tsx │ │ └── useWhyDidYouUpdate.ts │ ├── index.tsx │ ├── main.dev.ts │ ├── mainWindow/ │ │ └── windows.ts │ ├── menu.ts │ ├── routing/ │ │ ├── ClientRouter.ts │ │ └── routes.ts │ ├── store/ │ │ ├── configureStore/ │ │ │ ├── dev.ts │ │ │ ├── index.ts │ │ │ └── prod.ts │ │ ├── migrations.ts │ │ └── reducers.ts │ ├── styles/ │ │ ├── js/ │ │ │ ├── index.tsx │ │ │ ├── mixins.tsx │ │ │ ├── themes.ts │ │ │ └── variables.tsx │ │ ├── scss/ │ │ │ ├── app.global.scss │ │ │ ├── base/ │ │ │ │ ├── _base.scss │ │ │ │ ├── _extends.scss │ │ │ │ ├── _mixins.scss │ │ │ │ ├── _variables.scss │ │ │ │ └── mixins/ │ │ │ │ ├── _align-items.scss │ │ │ │ ├── _animate-link.scss │ │ │ │ ├── _animations.scss │ │ │ │ ├── _backface-visibility.scss │ │ │ │ ├── _background-cover.scss │ │ │ │ ├── _border.scss │ │ │ │ ├── _box-model.scss │ │ │ │ ├── _box-shadow.scss │ │ │ │ ├── _breakpoint.scss │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _display.scss │ │ │ │ ├── _display_flex.scss │ │ │ │ ├── _flex.scss │ │ │ │ ├── _hide-text.scss │ │ │ │ ├── _horz-vert-center.scss │ │ │ │ ├── _hover-focus.scss │ │ │ │ ├── _inline-block.scss │ │ │ │ ├── _inner-shadow.scss │ │ │ │ ├── _keyframes.scss │ │ │ │ ├── _linear-gradient-angle.scss │ │ │ │ ├── _linear-gradient.scss │ │ │ │ ├── _margin-auto.scss │ │ │ │ ├── _mediumFont.scss │ │ │ │ ├── _min-breakpoint.scss │ │ │ │ ├── _opacity.scss │ │ │ │ ├── _placeholder.scss │ │ │ │ ├── _rem.scss │ │ │ │ ├── _replace-text.scss │ │ │ │ ├── _retina.scss │ │ │ │ ├── _rounded-corners.scss │ │ │ │ ├── _single-transform.scss │ │ │ │ ├── _text-shadow.scss │ │ │ │ ├── _transform.scss │ │ │ │ ├── _transitions.scss │ │ │ │ ├── _translate.scss │ │ │ │ └── _triangles.scss │ │ │ └── themes/ │ │ │ ├── fonts.scss │ │ │ └── reset.scss │ │ └── select.tsx │ ├── tasks/ │ │ ├── common/ │ │ │ ├── classes/ │ │ │ │ ├── index.ts │ │ │ │ ├── monitor.ts │ │ │ │ └── task.ts │ │ │ ├── constants/ │ │ │ │ └── index.ts │ │ │ ├── contexts/ │ │ │ │ ├── footsite.ts │ │ │ │ ├── index.ts │ │ │ │ ├── pokemon.ts │ │ │ │ ├── shopify.ts │ │ │ │ └── yeezysupply.ts │ │ │ ├── index.ts │ │ │ └── utils/ │ │ │ ├── index.ts │ │ │ ├── logger.ts │ │ │ ├── queues.ts │ │ │ ├── request.ts │ │ │ ├── rfrl.ts │ │ │ └── timer.ts │ │ ├── footsites/ │ │ │ ├── classes/ │ │ │ │ ├── functions/ │ │ │ │ │ ├── billing.ts │ │ │ │ │ ├── captcha.ts │ │ │ │ │ ├── cart.ts │ │ │ │ │ ├── checkout.ts │ │ │ │ │ ├── email.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── information.ts │ │ │ │ │ ├── queue.ts │ │ │ │ │ ├── session.ts │ │ │ │ │ ├── shipping.ts │ │ │ │ │ └── stock.ts │ │ │ │ ├── tasks/ │ │ │ │ │ ├── base.ts │ │ │ │ │ └── index.ts │ │ │ │ └── types/ │ │ │ │ ├── datadome.d.ts │ │ │ │ ├── geetest.d.ts │ │ │ │ ├── index.ts │ │ │ │ ├── stock.d.ts │ │ │ │ └── variant.d.ts │ │ │ ├── constants/ │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── mocks/ │ │ │ │ ├── addToCart.ts │ │ │ │ ├── cookies/ │ │ │ │ │ ├── champs.js │ │ │ │ │ ├── cookies.ts │ │ │ │ │ ├── eb.js │ │ │ │ │ ├── fa.js │ │ │ │ │ ├── ftl-ca.js │ │ │ │ │ ├── ftl-kids.js │ │ │ │ │ └── ftl-us.js │ │ │ │ ├── getProductInfo.ts │ │ │ │ ├── getProductPage.ts │ │ │ │ ├── getSession.ts │ │ │ │ ├── getStock.ts │ │ │ │ ├── submitCheckout.ts │ │ │ │ └── submitInformation.ts │ │ │ └── utils/ │ │ │ ├── __tests__/ │ │ │ │ └── pickVariant.test.ts │ │ │ ├── cleanseHeaderData.ts │ │ │ ├── dfValues.ts │ │ │ ├── forms.ts │ │ │ ├── index.ts │ │ │ └── pickVariant.ts │ │ ├── index.ts │ │ ├── managers/ │ │ │ ├── analytics.ts │ │ │ ├── browser/ │ │ │ │ └── index.ts │ │ │ ├── cache/ │ │ │ │ ├── cache.ts │ │ │ │ └── windows.ts │ │ │ ├── captcha/ │ │ │ │ ├── autoSolve.ts │ │ │ │ ├── captcha.ts │ │ │ │ ├── windows.ts │ │ │ │ └── youtube.ts │ │ │ ├── checkout.ts │ │ │ ├── checkpoint/ │ │ │ │ └── index.tsx │ │ │ ├── geetest/ │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── interception/ │ │ │ │ ├── index.ts │ │ │ │ └── window.ts │ │ │ ├── notification.ts │ │ │ ├── profile/ │ │ │ │ ├── profile.ts │ │ │ │ └── typings.d.ts │ │ │ ├── proxy.ts │ │ │ ├── queue/ │ │ │ │ └── index.ts │ │ │ ├── restart.ts │ │ │ ├── tasks/ │ │ │ │ ├── choose.ts │ │ │ │ └── index.ts │ │ │ ├── typings.d.ts │ │ │ ├── utils.ts │ │ │ └── webhook/ │ │ │ ├── aycd.ts │ │ │ ├── discord.ts │ │ │ ├── index.ts │ │ │ └── slack.ts │ │ ├── pokemon/ │ │ │ ├── classes/ │ │ │ │ ├── functions/ │ │ │ │ │ ├── captcha.ts │ │ │ │ │ ├── cart.ts │ │ │ │ │ ├── checkout.ts │ │ │ │ │ ├── datadome.ts │ │ │ │ │ ├── email.ts │ │ │ │ │ ├── encrypt.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── information.ts │ │ │ │ │ ├── payment.ts │ │ │ │ │ ├── product.ts │ │ │ │ │ └── session.ts │ │ │ │ └── tasks/ │ │ │ │ ├── base.ts │ │ │ │ └── index.ts │ │ │ ├── constants/ │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── types/ │ │ │ │ ├── cart.d.ts │ │ │ │ ├── checkout.d.ts │ │ │ │ ├── datadome.d.ts │ │ │ │ ├── geetest.d.ts │ │ │ │ ├── index.d.ts │ │ │ │ ├── information.d.ts │ │ │ │ ├── key.d.ts │ │ │ │ ├── order.d.ts │ │ │ │ ├── payment.d.ts │ │ │ │ ├── product.d.ts │ │ │ │ ├── products.d.ts │ │ │ │ ├── success.d.ts │ │ │ │ └── token.d.ts │ │ │ └── utils/ │ │ │ ├── cards.ts │ │ │ ├── decode.ts │ │ │ ├── encrypt.ts │ │ │ ├── forms.ts │ │ │ ├── index.ts │ │ │ └── pickVariant.ts │ │ ├── shopify/ │ │ │ ├── classes/ │ │ │ │ ├── functions/ │ │ │ │ │ ├── account.ts │ │ │ │ │ ├── cart.ts │ │ │ │ │ ├── challenge.ts │ │ │ │ │ ├── checkout.ts │ │ │ │ │ ├── checkpoint.ts │ │ │ │ │ ├── config.ts │ │ │ │ │ ├── customer.ts │ │ │ │ │ ├── discount.ts │ │ │ │ │ ├── homepage.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── order.ts │ │ │ │ │ ├── password.ts │ │ │ │ │ ├── payment.ts │ │ │ │ │ ├── paypal.ts │ │ │ │ │ ├── product.ts │ │ │ │ │ ├── queue.ts │ │ │ │ │ ├── review.ts │ │ │ │ │ ├── session.ts │ │ │ │ │ └── shipping.ts │ │ │ │ ├── monitor.ts │ │ │ │ ├── rates.ts │ │ │ │ └── tasks/ │ │ │ │ ├── base.ts │ │ │ │ ├── fast.ts │ │ │ │ ├── index.ts │ │ │ │ ├── pfutile.ts │ │ │ │ ├── preload.ts │ │ │ │ └── safe.ts │ │ │ ├── constants/ │ │ │ │ ├── gateways.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── mocks/ │ │ │ │ ├── __cookies__.ts │ │ │ │ ├── apiCheckouts.tsx │ │ │ │ ├── checkout.ts │ │ │ │ ├── deadstockQuestion.ts │ │ │ │ ├── kithMock.tsx │ │ │ │ ├── paymentsConfig.ts │ │ │ │ ├── responseTypes.ts │ │ │ │ └── sessions.ts │ │ │ ├── types/ │ │ │ │ ├── cart.d.ts │ │ │ │ ├── index.d.ts │ │ │ │ ├── product.d.ts │ │ │ │ └── rates.d.ts │ │ │ └── utils/ │ │ │ ├── __tests__/ │ │ │ │ └── pickVariant.test.ts │ │ │ ├── forms.ts │ │ │ ├── index.ts │ │ │ ├── mocks/ │ │ │ │ └── kithNewBalance.ts │ │ │ ├── parse.ts │ │ │ ├── pickVariant.ts │ │ │ └── protection.ts │ │ └── yeezysupply/ │ │ ├── classes/ │ │ │ ├── functions/ │ │ │ │ ├── 3ds.ts │ │ │ │ ├── akamai.ts │ │ │ │ ├── bloom.ts │ │ │ │ ├── cart.ts │ │ │ │ ├── checkout.ts │ │ │ │ ├── homepage.ts │ │ │ │ ├── index.ts │ │ │ │ ├── information.ts │ │ │ │ ├── mpulse.ts │ │ │ │ ├── pixel.ts │ │ │ │ ├── product.ts │ │ │ │ ├── splash.ts │ │ │ │ ├── stock.ts │ │ │ │ └── waiting.ts │ │ │ ├── tasks/ │ │ │ │ ├── base.ts │ │ │ │ └── index.ts │ │ │ └── types/ │ │ │ └── index.ts │ │ ├── constants/ │ │ │ └── index.ts │ │ ├── index.ts │ │ ├── mocks/ │ │ │ ├── addToCart.ts │ │ │ ├── cookies.ts │ │ │ ├── getAvailability.ts │ │ │ ├── getProductInfo.ts │ │ │ ├── getProductPage.ts │ │ │ ├── submitCheckout.ts │ │ │ └── submitInformation.ts │ │ └── utils/ │ │ ├── __tests__/ │ │ │ └── pickVariant.test.ts │ │ ├── dfValues.ts │ │ ├── forms.ts │ │ ├── index.ts │ │ └── pickVariant.ts │ └── utils/ │ ├── assert.ts │ ├── bootHelper.ts │ ├── captchaTypes.ts │ ├── cardFormatter.ts │ ├── comparators.ts │ ├── convertObjectToArray.ts │ ├── createWindows.ts │ ├── date.js │ ├── eventHandling.ts │ ├── funcs.js │ ├── getPlatform.ts │ ├── gzip.ts │ ├── imgForCardType.ts │ ├── imgsrc.ts │ ├── isEncoded.ts │ ├── isOnline.ts │ ├── isPackaged.js │ ├── loadFile.ts │ ├── loadUrls.ts │ ├── log.ts │ ├── paths.js │ ├── pkginfo.js │ ├── proxy.ts │ ├── randInt.ts │ ├── reducerPrefixer.ts │ ├── saveFile.ts │ ├── sleep.ts │ ├── storageHelper.ts │ ├── styleResets.ts │ ├── testProxies.ts │ ├── titlebarDoubleClick.ts │ ├── trimFat.ts │ ├── url.ts │ └── validateTasks.ts ├── autosolve-client.d.ts ├── babel.config.js ├── babelx.js ├── chrome-paths.d.ts ├── config/ │ └── env/ │ ├── env.dev.js │ ├── env.prod.js │ └── index.js ├── electron-builder.yml ├── internals/ │ └── scripts/ │ ├── AfterPack.js │ ├── CheckBuiltsExist.js │ ├── CheckNodeEnv.js │ ├── CheckPortInUse.js │ ├── CheckYarn.js │ └── Notarize.js ├── jest.config.js ├── jest.setup.js ├── jsdom-extra.d.ts ├── package.json ├── preloads/ │ ├── 3ds.js │ ├── auth.js │ └── harvester.js ├── test/ │ ├── babel-transformer.js │ ├── babelRegisterTs.js │ ├── debug.ts │ ├── mockOffsetSize.tsx │ ├── polyfill.js │ └── testUtils.tsx ├── tsconfig.json └── webpack/ ├── config.base.js ├── config.eslint.js ├── config.main.prod.babel.js ├── config.renderer.dev.babel.js ├── config.renderer.dev.dll.babel.js └── config.renderer.prod.babel.js ================================================ FILE CONTENTS ================================================ ================================================ FILE: .eslintignore ================================================ # Logs logs *.log # Runtime data pids *.pid *.seed # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # node-waf configuration .lock-wscript # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release .eslintcache # Dependency directory # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules # OSX .DS_Store # flow-typed flow-typed/npm/* !flow-typed/npm/module_vx.x.x.js # App packaged release app/*.prod.js app/style.css app/style.css.map dist dll main.js main.js.map .idea npm-debug.log.* __snapshots__ # Package.json package.json .travis.yml .idea vendors build docs .vscode .github app/dll .prettierrc .stylelintrc .eslintrc.json ================================================ FILE: .eslintrc.js ================================================ module.exports = { parser: '@typescript-eslint/parser', parserOptions: { sourceType: 'module', allowImportExportEverywhere: true, ecmaVersion: 10, ecmaFeatures: { modules: true, }, }, env: { browser: true, node: true, jest: true, es6: true, }, plugins: ['import', 'promise', 'compat', 'react', '@typescript-eslint'], extends: ['airbnb', 'plugin:prettier/recommended', 'prettier/react'], settings: { 'import/resolver': { webpack: { config: 'webpack/config.eslint.js', }, node: { extensions: ['.js', '.jsx', '.ts', '.tsx'], }, 'eslint-import-resolver-typescript': true, }, }, rules: { 'linebreak-style': 0, 'arrow-parens': 'off', 'compat/compat': 'error', 'consistent-return': 'off', 'comma-dangle': 'off', 'generator-star-spacing': 'off', 'import/no-unresolved': 'error', 'import/extensions': [ 'error', 'always', { ts: 'never', tsx: 'never', js: 'never', jsx: 'never', }, ], 'import/no-extraneous-dependencies': ['error', { devDependencies: true }], 'jsx-a11y/anchor-is-valid': 'off', 'jsx-a11y/label-has-for': 'off', 'jsx-a11y/no-noninteractive-element-interactions': 'off', 'jsx-a11y/label-has-associated-control': 'off', 'jsx-a11y/no-static-element-interactions': 'off', 'jsx-a11y/click-events-have-key-events': 'off', 'no-console': [ 'error', { allow: ['info', 'error', 'warn'], }, ], 'no-use-before-define': 'off', 'no-multi-assign': 'off', 'prettier/prettier': ['error', { singleQuote: true }], 'promise/param-names': 'error', 'promise/always-return': 'error', 'promise/catch-or-return': 'error', 'promise/no-native': 'off', 'react/sort-comp': [ 'error', { order: ['type-annotations', 'static-methods', 'lifecycle', 'everything-else', 'render'], }, ], 'react/jsx-no-bind': 'off', 'react/jsx-filename-extension': ['error', { extensions: ['.js', '.jsx', '.ts', '.tsx'] }], 'react/prefer-stateless-function': 'off', strict: 'off', 'import/prefer-default-export': 'off', 'arrow-body-style': 'off', 'no-underscore-dangle': 'off', 'class-methods-use-this': 'off', 'no-shadow': 'off', 'react/prop-types': 'off', 'import/no-dynamic-require': 'off', 'no-unused-vars': 'off', //use typescript version. 'no-restricted-syntax': 1, '@typescript-eslint/no-unused-vars': [ 'error', // setting this to warn for now... // TODO fix these when we finish typescript migration. { args: 'after-used', argsIgnorePattern: '^(args|theme|props|state|ownProps|dispatch|getState)|_', varsIgnorePattern: '^(args|variables|mixins|args|log)', }, ], }, globals: { fetchMock: true, }, }; ================================================ FILE: .gitattributes ================================================ * text eol=lf *.png binary *.jpg binary *.jpeg binary *.ico binary *.icns binary ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve title: '' labels: bug assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **Expected behavior** If you're describing a bug, tell us what should happen. If you're suggesting a change/improvement, tell us how it should work. **Current Behavior** If describing a bug, tell us what happens instead of the expected behavior. If suggesting a change/improvement, explain the difference between current behavior. **Possible Solution** Not obligatory, but suggest a fix/reason for the bug or ideas how to implement the addition or change. **Steps to Reproduce** Provide a link to a live example or an unambiguous set of steps to reproduce this bug. Include code to reproduce, if relevant 1. 2. 3. 4. **Environment** Include as many relevant details about the environment you experienced the bug in - Node version : - Version or Branch used : - Operating System and version [e.g. macOS 10.14 Mojave]: - App Version [e.g. v2.0.0]: **Screenshots / Recordings** If applicable, add screenshots to help explain your problem. ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: You want something added to the app or code. title: '' labels: enhancement assignees: '' --- ================================================ FILE: .gitignore ================================================ # Logs logs *.log # Runtime data pids *.pid *.seed # Directory for instrumented libs generated by jscoverage/JSCover lib-cov # Coverage directory used by tools like istanbul coverage # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) .grunt # node-waf configuration .lock-wscript # Compiled binary addons (http://nodejs.org/api/addons.html) build/Release .eslintcache # Dependency directory # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules/ app/node_modules # OSX .DS_Store # flow-typed flow-typed/npm/* !flow-typed/npm/module_vx.x.x.js # App packaged release app/build app/*.prod.js app/renderer.prod.js app/style.css dist dll main.js main.js.map .idea npm-debug.log.* package-lock.json app/certs/*.pem app/certs/* certs/* todo.txt *yarn-error.log eslint-common-rules.txt build/entitlements.mas.plist *embedded.provisionprofile junit.xml .VSCodeCounter electron ================================================ FILE: .prettierrc ================================================ { "overrides": [ { "files": [".prettierrc", ".babelrc", ".eslintrc", ".stylelintrc"], "options": { "parser": "json" } } ], "singleQuote": true, "trailingComma": "none", "arrowParens": "avoid", "endOfLine": "auto" } ================================================ FILE: .stylelintrc ================================================ { "extends": ["stylelint-config-standard", "stylelint-config-prettier"], "rules": { "at-rule-no-unknown": null, "no-descending-specificity": null } } ================================================ FILE: app/3ds.html ================================================
================================================ FILE: app/Harvester.html ================================================
Please enter your license key below
© 2021 Nebula Automation, LLC
================================================ FILE: app/classes/AppUpdate.ts ================================================ /* eslint-disable import/first */ import { app, dialog, BrowserWindow } from 'electron'; import { autoUpdater, CancellationToken } from 'electron-updater'; import { version } from '../../package.json'; app.getVersion = () => version; import { isConnected } from '../utils/isOnline'; import { log } from '../utils/log'; import { isPackaged } from '../utils/isPackaged'; import { PATHS } from '../utils/paths'; import { ENABLE_BACKGROUND_AUTO_UPDATE } from '../constants'; import { unixTimestampNow } from '../utils/date'; import { getMainWindow } from '../mainWindow/windows'; import { undefinedOrNull } from '../utils/funcs'; let progressbarWindow: BrowserWindow | null = null; let mainWindow: BrowserWindow; const createChildWindow = () => { try { return new BrowserWindow({ parent: mainWindow, modal: true, show: false, height: 150, width: 600, title: 'Update downloading...', resizable: false, minimizable: false, maximizable: false, fullscreenable: false, movable: false, webPreferences: { nodeIntegration: true } }); } catch (e) { log.error(e, `AppUpdate -> createChildWindow`); return null; } }; const fireProgressbar = () => { try { if (progressbarWindow) { progressbarWindow.show(); progressbarWindow.focus(); return; } progressbarWindow = createChildWindow(); if (progressbarWindow) { progressbarWindow.loadURL(`${PATHS.loadUrlPath}#progressbarPage`); progressbarWindow.webContents.on('did-finish-load', () => { if (progressbarWindow) { progressbarWindow.show(); progressbarWindow.focus(); } }); progressbarWindow.on('closed', () => { progressbarWindow = null; }); progressbarWindow.on('unresponsive', (error: any) => { log.error(error, `AppUpdate -> progressbarWindow -> onerror`); }); } } catch (e) { log.error(e, `AppUpdate -> fireProgressbar`); } }; export default class AppUpdate { autoUpdater: any; domReadyFlag: boolean; updateInitFlag: boolean; updateForceCheckFlag: boolean; _errorDialog: { timeGenerated: number; title: string | null; message: string | null; }; cancellationToken: any; updateIsDownloading: any; updateIsActive: number; disableAutoUpdateCheck: boolean; constructor() { this.autoUpdater = autoUpdater; if (!isPackaged) { this.autoUpdater.updateConfigPath = PATHS.appUpdateFile; } // Just in case we end up attaching more than 10 listeners this.autoUpdater.setMaxListeners(Infinity); this.autoUpdater.autoDownload = ENABLE_BACKGROUND_AUTO_UPDATE; this.domReadyFlag = false; this.updateInitFlag = false; this.updateForceCheckFlag = false; this._errorDialog = { timeGenerated: 0, title: null, message: null }; this.cancellationToken = new CancellationToken(); this.updateIsDownloading = false; this.updateIsActive = 0; // 0 = no, 1 = update check in progress, -1 = update in progress this.disableAutoUpdateCheck = false; } init() { try { if (this.updateInitFlag) { return; } this.autoUpdater.on('error', (error: any) => { const errorMsg = error == null ? 'unknown' : (error.stack || error).toString(); if (progressbarWindow) { progressbarWindow.close(); } this.closeActiveUpdates(); if (this.isNetworkError(error)) { this.spitMessageDialog( 'Update Error', 'Oops.. A network error occured. Try again!', 'error' ); log.doLog(error); this.updateForceCheckFlag = false; this.disableAutoUpdateCheck = false; this.updateIsActive = 0; return; } if (/Cannot find channel/i.test(error)) { this.spitMessageDialog( 'No Updates Found', 'You have the latest version installed.', 'info' ); log.doLog(error); this.updateForceCheckFlag = false; this.disableAutoUpdateCheck = false; this.updateIsActive = 0; return; } this.spitMessageDialog( 'Update Error', 'Oops.. Some error occured while updating the app. Try again!', 'error' ); this.updateForceCheckFlag = false; this.disableAutoUpdateCheck = false; this.updateIsActive = 0; log.error(errorMsg, `AppUpdate -> onerror`); }); this.autoUpdater.on('update-available', async () => { if (progressbarWindow && this.updateIsActive !== -1) { progressbarWindow.close(); } const { response } = await dialog.showMessageBox({ type: 'info', title: 'Update Available', message: 'New version available. Download now?', buttons: ['Yes', 'No'] }); if (response === 0) { if (progressbarWindow) { progressbarWindow.close(); } this.closeActiveUpdates(-1); this.initDownloadUpdatesProgress(); this.autoUpdater.downloadUpdate(this.cancellationToken); } this.closeActiveUpdates(); this.updateForceCheckFlag = false; this.disableAutoUpdateCheck = false; this.updateIsActive = 0; }); this.autoUpdater.on('download-progress', (progress: any) => { if (!progressbarWindow) { return; } this.setUpdateProgressWindow({ value: progress.percent || 0 }); }); this.autoUpdater.on('update-downloaded', async () => { this.closeActiveUpdates(); if (progressbarWindow) { progressbarWindow.close(); } await dialog.showMessageBox({ type: 'info', title: 'Update Installed', message: 'Downloaded! Application will relaunch now.', buttons: ['Continue'] }); this.autoUpdater.quitAndInstall(); }); this.updateInitFlag = true; } catch (e) { log.error(e, `AppUpdate -> init`); } } pollForUpdates() { try { this.setMainWindow(); if (!mainWindow) { return; } isConnected() .then((connected: any) => { if (!connected) { return null; } if (this.updateIsActive === 1 || this.disableAutoUpdateCheck) { return null; } this.autoUpdater.on('update-not-available', () => { this.updateForceCheckFlag = false; this.disableAutoUpdateCheck = false; this.updateIsActive = 0; }); if (this.updateIsDownloading) { this.cancellationToken.cancel(); } this.autoUpdater.checkForUpdates(); this.updateIsActive = 1; return true; }) .catch(() => {}); } catch (e) { log.error(e, `AppUpdate -> checkForUpdates`); } } checkForUpdates() { try { this.setMainWindow(); if (!mainWindow) { return; } isConnected() .then((connected: any) => { if (!connected) { return null; } if (this.updateIsActive === 1 || this.disableAutoUpdateCheck) { return null; } this.autoUpdater.on('checking-for-update', () => { this.setCheckUpdatesProgress(); }); this.autoUpdater.on('update-not-available', () => { this.closeActiveUpdates(); if (progressbarWindow) { progressbarWindow.close(); } this.updateForceCheckFlag = false; this.disableAutoUpdateCheck = false; this.updateIsActive = 0; }); if (this.updateIsDownloading) { this.cancellationToken.cancel(); } this.autoUpdater.checkForUpdates(); this.updateIsActive = 1; return true; }) .catch(() => {}); } catch (e) { log.error(e, `AppUpdate -> checkForUpdates`); } } async forceCheck() { try { this.setMainWindow(); if (!mainWindow) { return; } if (!this.updateForceCheckFlag && this.updateIsActive !== 1) { this.autoUpdater.once('update-not-available', async () => { this.closeActiveUpdates(); if (progressbarWindow) { progressbarWindow.close(); } await dialog.showMessageBox({ title: 'No update found!', message: 'You have the latest version installed.', buttons: ['Close'] }); this.updateForceCheckFlag = false; this.disableAutoUpdateCheck = false; this.updateIsActive = 0; }); } if (this.updateIsActive === 1) { return; } if (this.updateIsActive === -1) { const { response } = await dialog.showMessageBox({ title: 'Update in progress', message: 'Another update is in progess. Are you sure want to restart the update?', buttons: ['Yes', 'No'] }); if (response === 0) { if (this.updateIsDownloading) { this.cancellationToken.cancel(); } this.autoUpdater.checkForUpdates(); this.updateIsActive = -1; } return; } if (this.updateIsDownloading) { this.cancellationToken.cancel(); } this.autoUpdater.checkForUpdates(); this.updateForceCheckFlag = true; this.disableAutoUpdateCheck = true; this.updateIsActive = 1; } catch (e) { log.error(e, `AppUpdate -> forceCheck`); } } setCheckUpdatesProgress() { try { isConnected() .then((connected: any) => { if (!connected) { this.spitMessageDialog( 'Checking For Updates', 'Internet connection is unavailable.' ); return null; } fireProgressbar(); this.setTaskBarProgressBar(2); if (progressbarWindow) { progressbarWindow.webContents.on('dom-ready', () => { if (progressbarWindow) { progressbarWindow.webContents.send( 'progressBarDataCommunication', { progressTitle: `Checking For Updates`, progressBodyText: `Please wait...`, value: 0, variant: `indeterminate` } ); } }); } return true; }) .catch(() => {}); } catch (e) { log.error(e, `AppUpdate -> setCheckUpdatesProgress`); } } initDownloadUpdatesProgress() { try { isConnected() .then((connected: any) => { if (!connected) { this.spitMessageDialog( 'Downloading Updates', 'Internet connection is unavailable.' ); return null; } fireProgressbar(); this.updateIsDownloading = true; this.domReadyFlag = false; this.setUpdateProgressWindow({ value: 0 }); return true; }) .catch(() => {}); } catch (e) { log.error(e, `AppUpdate -> initDownloadUpdatesProgress`); } } setUpdateProgressWindow({ value = 0 }) { try { const data = { progressTitle: `Downloading Updates`, progressBodyText: `Please wait...`, value, variant: `determinate` }; this.setTaskBarProgressBar(value / 100); if (this.domReadyFlag && progressbarWindow) { progressbarWindow.webContents.send( 'progressBarDataCommunication', data ); return; } if (progressbarWindow) { progressbarWindow.webContents.on('dom-ready', () => { if (progressbarWindow) { progressbarWindow.webContents.send( 'progressBarDataCommunication', data ); this.domReadyFlag = true; } }); } } catch (e) { log.error(e, `AppUpdate -> setUpdateProgressWindow`); } } setMainWindow() { const _mainWindow = getMainWindow(); if (!_mainWindow || undefinedOrNull(_mainWindow)) { return; } mainWindow = _mainWindow; } setTaskBarProgressBar(value: any) { try { if (mainWindow) { mainWindow.setProgressBar(value); } } catch (e) { log.error(e, `AppUpdate -> setTaskBarProgressBar`); } } isNetworkError(errorObj: any) { return ( errorObj.message === 'net::ERR_INTERNET_DISCONNECTED' || errorObj.message === 'net::ERR_PROXY_CONNECTION_FAILED' || errorObj.message === 'net::ERR_CONNECTION_RESET' || errorObj.message === 'net::ERR_CONNECTION_CLOSE' || errorObj.message === 'net::ERR_NAME_NOT_RESOLVED' || errorObj.message === 'net::ERR_CONNECTION_TIMED_OUT' ); } async spitMessageDialog(title: string, message: string, type = 'message') { const { timeGenerated: _timeGenerated } = this._errorDialog; const delayTime = 1000; if ( _timeGenerated !== 0 && _timeGenerated - unixTimestampNow() < delayTime ) { return; } this._errorDialog = { timeGenerated: unixTimestampNow(), title, message }; switch (type) { default: case 'message': await dialog.showMessageBox({ title, message, buttons: ['Close'] }); break; case 'error': dialog.showErrorBox(title, message); break; } } closeActiveUpdates(updateIsActive = 0) { this.setTaskBarProgressBar(-1); this.updateIsActive = updateIsActive; } } ================================================ FILE: app/classes/Boot.ts ================================================ /* eslint no-await-in-loop: off */ /** * Boot * Note: Don't import log helper file from utils here */ import { readdirSync } from 'fs'; import { baseName, PATHS } from '../utils/paths'; import { fileExistsSync, writeFileAsync, createDirSync, deleteFilesSync } from '../api/sys/fileOps'; import { daysDiff, yearMonthNow } from '../utils/date'; import { LOG_FILE_ROTATION_CLEANUP_THRESHOLD } from '../constants'; const { logFile, settingsFile, authFile, logDir } = PATHS; const logFileRotationCleanUpThreshold = LOG_FILE_ROTATION_CLEANUP_THRESHOLD; export default class Boot { verifyDirList: string[]; verifyFileList: string[]; settingsFile: string; authFile: string; constructor() { this.verifyDirList = [logDir]; this.verifyFileList = [logFile, settingsFile, authFile]; this.settingsFile = settingsFile; this.authFile = authFile; } async init() { try { for (let i = 0; i < this.verifyDirList.length; i += 1) { const item = this.verifyDirList[i]; if (!(await this.verifyDir(item))) { await this.createDir(item); } } if (!this.verifyFile(this.authFile)) { await this.createFile(this.authFile); } if (!this.verifyFile(this.settingsFile)) { await this.createFile(this.settingsFile); } for (let i = 0; i < this.verifyFileList.length; i += 1) { const item = this.verifyFileList[i]; if (!this.verifyFile(item)) { await this.createFile(item); } } return; } catch (e) { console.error(e); } } async verify() { try { for (let i = 0; i < this.verifyFileList.length; i += 1) { const item = this.verifyDirList[i]; if (!(await this.verifyDir(item))) { return; } } for (let i = 0; i < this.verifyFileList.length; i += 1) { const item = this.verifyFileList[i]; if (!this.verifyFile(item)) { return; } } return; } catch (e) { console.error(e); } } quickVerify() { try { for (let i = 0; i < this.verifyFileList.length; i += 1) { const item = this.verifyFileList[i]; if (!this.verifyFile(item)) { return false; } } return true; } catch (e) { console.error(e); return false; } } async verifyDir(filePath: string) { try { return fileExistsSync(filePath); } catch (e) { console.error(e); return null; } } async createDir(newFolderPath: string) { try { createDirSync(newFolderPath); } catch (e) { console.error(e); } } verifyFile(filePath: string) { try { return fileExistsSync(filePath); } catch (e) { console.error(e); return null; } } createFile(filePath: string) { try { writeFileAsync(filePath, ``); } catch (e) { console.error(e); } } cleanRotationFiles() { try { const dirFileList = readdirSync(logDir); const pattern = `^\\${baseName(logFile)}`; const _regex = new RegExp(pattern, 'gi'); const filesList = dirFileList.filter(elm => { return !elm.match(_regex); }); if (filesList === null || filesList.length < 1) { return null; } filesList.map(async a => { const dateMatch = a.match(/\d{4}-\d{2}/g); if ( dateMatch === null || dateMatch.length < 1 || typeof dateMatch[0] === 'undefined' || dateMatch[0] === null ) { return; } const _diff = daysDiff(yearMonthNow({}), dateMatch[0]); if (_diff >= logFileRotationCleanUpThreshold) { deleteFilesSync(`${logDir}/${a}`); } }); return null; } catch (e) { console.error(e); return null; } } } ================================================ FILE: app/classes/Notification.ts ================================================ import { PATHS } from '../utils/paths'; import { IS_DEV } from '../constants/env'; /* Cache of Audio elements, for instant playback */ const cache: any = {}; const VOLUME = 0.55; // these get packaged into renderer.prod.js which resides in the same filepath as the app.html const sounds: any = { DONE: { url: IS_DEV ? PATHS.successSoundPath : './success.mp3', volume: VOLUME }, HEADS_UP: { url: IS_DEV ? PATHS.notifySoundPath : './notify.mp3', volume: VOLUME } }; function preload() { // eslint-disable-next-line no-restricted-syntax for (const name in sounds) { if (!cache[name]) { const sound = sounds[name]; const audio = (cache[name] = new window.Audio()); audio.volume = sound.volume; audio.src = sound.url; } } } function play(name: string) { let audio = cache[name]; if (!audio) { const sound = sounds[name]; if (!sound) { throw new Error('Invalid sound name'); } audio = cache[name] = new window.Audio(); audio.volume = sound.volume || VOLUME; audio.src = sound.url; } audio.currentTime = 0; audio.play(); } export { preload, play }; ================================================ FILE: app/classes/ProxyTester.ts ================================================ import { isEmpty } from 'lodash'; import { ipcMain, IpcMainInvokeEvent, BrowserWindow } from 'electron'; import { IPCKeys } from '../constants/ipc'; import { Proxy } from '../components/Proxies/reducers/current'; import { testProxy } from '../utils/testProxies'; import { StaggeredQueue } from '../tasks/common/utils'; export default class ProxyTester { mainWindow: BrowserWindow | null; hasLogged: boolean; queue: StaggeredQueue; results: { [group: string]: { [ip: string]: { speed: number | 'failed'; }; }; }; interval: { [id: string]: any; }; constructor(mainWindow: BrowserWindow | null) { this.queue = new StaggeredQueue(false, 20); this.hasLogged = false; this.mainWindow = mainWindow; this.results = {}; this.interval = {}; ipcMain.on(IPCKeys.RequestTestProxy, this.insert); } process = async ({ group, id, url }: any) => { if (this.mainWindow) { const time = await testProxy(url, id); if (!this.results[group]) { this.results[group] = {}; } this.results[group][id] = time; } }; start = (group: string) => { if (!this.interval[group]) { this.interval[group] = setInterval(() => { if (isEmpty(this.results[group])) { return; } if (this.mainWindow) { this.mainWindow.webContents.send( IPCKeys.ResponseTestProxy, group, this.results[group] ); this.results[group] = {}; } }, 1000); } }; stop = (group: string) => { if (this.interval[group]) { clearInterval(this.interval[group]); this.interval[group] = null; } }; clear = () => { this.queue.clear(); return Object.keys(this.results).map((id: string) => this.stop(id)); }; remove = (group: string, ip: string) => { this.queue.removeJob(group, ip); }; insert = ( _: IpcMainInvokeEvent, id: string, url: string, proxies: Proxy[] ) => { const promises = proxies.map(({ ip }) => this.queue.add(id, ip, this.process, { url }) ); this.start(id); Promise.all(promises).catch(() => {}); }; } ================================================ FILE: app/classes/Storage.ts ================================================ import { log } from '../utils/log'; import { readFileSync, writeFileSync, deleteFilesSync } from '../api/sys/fileOps'; export default class Storage { filePath: string; constructor(filePath: string) { this.filePath = filePath; } getAll() { try { const _stream = readFileSync(this.filePath); if ( typeof _stream === 'undefined' || _stream === null || Object.keys(_stream).length < 1 ) { return {}; } return JSON.parse(_stream); } catch (e) { log.error(e, `Storage -> getAll`); } } getItem(key: string) { try { if (typeof key === 'undefined' || key === null) { return null; } // get all items const allItems = this.getAll(); if (allItems[key]) { return allItems[key]; } return null; } catch (e) { log.error(e, 'Storage -> getItem'); } } getItems(keys: any) { try { if (typeof keys === 'undefined' || keys === null || keys.length < 0) { return {}; } const allItem = this.getAll(); const _return: any = {}; // eslint-disable-next-line array-callback-return keys.map((a: any) => { if (typeof allItem[a] === 'undefined' || allItem[a] === null) { return; } _return[a] = allItem[a]; }); return _return; } catch (e) { log.error(e, `Storage -> getAll`); return null; } } setAll({ ...data }) { try { writeFileSync(this.filePath, JSON.stringify({ ...data })); } catch (e) { log.error(e, `Storage -> setAll`); } } set(key: string, value: any) { try { // get all items const allItems = this.getAll(); // update / set the item allItems[key] = value; // write back to file this.setAll({ ...allItems }); } catch (e) { log.error(e, 'Storage -> set'); } } delete() { try { deleteFilesSync(this.filePath); } catch (e) { log.error(e, 'Storage -> delete'); } } } ================================================ FILE: app/components/Analytics/Loadable.tsx ================================================ import Loadable from 'react-imported-component'; import LoadingIndicator from '../LoadingIndicator'; /* eslint import/no-cycle: [2, { maxDepth: 1 }] */ export default Loadable(() => import('./index'), { LoadingComponent: LoadingIndicator }); ================================================ FILE: app/components/Analytics/__tests__/Analytics.spec.tsx ================================================ import { render } from '@testing-library/react'; import '@testing-library/jest-dom/extend-expect'; import React from 'react'; import Analytics from '../index'; import { withProviders } from '../../../../test/testUtils'; const news = [ { _id: '5e4e11261c9d440000d10758', id: '277f561b-928a-40d1-af5b-dca9ea765e1c', date: 1582174646797, message: 'The time has finally come.. Close your eyes and take a deep breath. Now open them. Welcome to family. Welcome to Omega.', type: 'UPDATE' } ]; beforeEach(() => { fetchMock.resetMocks(); }); it('should render Analytics', async () => { fetchMock.mockIf(/^https?:\/\/nebula-auth.herokuapp.com.*$/, async req => { if (req.url.endsWith('/news')) { return { body: JSON.stringify(news) }; } if (req.url.endsWith('/checkouts')) { return { body: JSON.stringify([]) }; } return { status: 404, body: 'Not Found' }; }); const Root = withProviders({ Component: Analytics }); // eslint-disable-next-line const { debug, getByTestId, getByText } = render(
Effective date: {EFFECTIVE_DATE}
{APP_NAME} ("us", "we", or "our") operates the app (hereinafter referred to as the "Service").
{AUTHOR_NAME} built the "{APP_NAME}" app as an Open Source app. This SERVICE is provided by {AUTHOR_NAME} at an agreed $35 (USD) per month, and is intended for use as is.
This page informs you of our policies regarding the collection, use, and disclosure of personal data when you use our Service and the choices you have associated with that data.
We use your data to provide, study and improve the Service. By using the Service, you agree to the collection and use of information in accordance with this policy.
Information Collection And Use
We take your privacy very seriously and we DO NOT gather or transfer any sort of personal data out of your device in any form. We gather a very limited amount of ANONYMOUS information from you which will be used for various purposes such as providing and improving our Service to you. You may always choose not to share such ANONYMOUS information with us.
Types of Data Collected
Personal Data While using our Service, we DO NOT ask you to provide us with any kind of personally identifiable information that can be used to contact or identify you ("Personal Data").
Cookies: Cookies are files with a small amount of data that are commonly used as anonymous unique identifiers. These are sent to your browser from the websites that you visit and are stored on your device's internal memory.
This Service does not use these "cookies" explicitly. However, the app may use third party code and libraries that use “cookies” to collect information and improve their services. You have the option to either accept or refuse these cookies and know when a cookie is being sent to your device. If you choose to refuse our cookies, you may not be able to use some portions of this Service.
Usage Data: We may also collect anonymous information on how the Service is accessed and used ("Usage Data"). This Usage Data may include information such as your computer's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that you visit, the time and date of your visit, the time spent on those pages, "encrypted" unique device identifiers and other diagnostic data.
LocalStorage Data: We use "LocalStorage" and similar technologies to gather information about the activity on our Service and hold very limited information. LocalStorages are files with small amount of data which may include an anonymous unique identifier.
You may always "Opt-Out" of sharing anonymous usage data with us by navigating to "Settings" option and disabling the "Enable anonymous usage statistics gathering" button.
Examples of LocalStorage files we use:
Use of Data
{APP_NAME} uses the collected data for various purposes:
Transfer Of Data
Your information may be transferred to — and maintained on — computers located outside of your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from your jurisdiction.
Your consent to this Privacy Policy followed by your submission of such information represents your agreement to that transfer.
{APP_NAME} will take all steps reasonably necessary to ensure that your data is treated securely and in accordance with this Privacy Policy and no transfer of your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of your data and other personal information.
Disclosure Of Data
Legal Requirements
{APP_NAME} may disclose your data in the good faith belief that such action is necessary to:
Security Of Data
The security of your data is important to us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While we strive to use commercially acceptable means to protect your Personal Data, we cannot guarantee its absolute security.
Service Providers
We may employ third party companies and individuals to facilitate our Service ("Service Providers"), to provide the Service on our behalf, to perform Service-related services or to assist us in analyzing how our Service is used.
These third parties have access to your Personal Data only to perform these tasks on our behalf and are obligated not to disclose or use it for any other purpose.
Analytics
We may use third-party Service Providers to monitor and analyze the use of our Service.
Google Analytics
Google Analytics is a web analytics service offered by Google that tracks and reports website/app traffic. Google uses the data collected to track and monitor the use of our Service. We respect the privacy of our users and we have chosen to "Opt-Out" of sharing the data with other Google products & services. We will never allow Google to remarket or use your data for its advertising, benchmarking and other internal services.
For more information on the privacy practices of Google, please visit the Google Privacy & Terms web page: { openExternalUrl( 'https://policies.google.com/privacy?hl=en', events ); }} > https://policies.google.com/privacy?hl=en
Links To Other Sites
Our Service may contain links to other sites that are not operated by us. If you click on a third party link, you will be directed to that third party's site. We strongly advise you to review the Privacy Policy of every site you visit.
We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.
Internet Activity
We periodically send out requests to GitHub.com servers to check for the latest app updates and to determine whether an internet connection is available.
You may "Opt-Out" of the "Auto App-update checks" by navigating to "Settings" option and disabling the "Enable auto-update check" button.
Please refer to { openExternalUrl( 'https://help.github.com/articles/github-privacy-statement/', events ); }} > https://help.github.com/articles/github-privacy-statement/ for more information.
Plugins or Add-ons
We have used google-ga npm package to facilitate the Google analytics feature inside the app.
Crash Reports
We have implemented a very powerful diagnostic tool to capture and report the Crash Reports and bug encountered by the application. The Crash Reports are stored inside your device as log files. These log files can be accessed by navigating to "~/.io.ganeshrvel/{APP_IDENTIFIER}/logs/" folder. You may choose to send us these log files by selecting the "Help" menu > "Report Bugs" and clicking on the "EMAIL ERROR LOGS" buttons.
Children's Privacy
Our Service does not address anyone under the age of 18 ("Children").
We do not knowingly collect personally identifiable information from anyone under the age of 18. If you are a parent or guardian and you are aware that your Children has provided us with Personal Data, please contact us. If we become aware that we have collected Personal Data from children without verification of parental consent, we take steps to remove that information from our servers.
Changes To This Privacy Policy
We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page.
You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.
Contact Us
If you have any questions about this Privacy Policy, please contact us through { openExternalUrl(APP_WEBSITE, events); }} > our Twitter or by { openExternalUrl(`mailto:${AUTHOR_EMAIL}`, events); }} > email .
Effective date: {EFFECTIVE_DATE}
{APP_NAME} ("us", "we", or "our") operates the app (hereinafter referred to as the "Service").
Your access to and use of the Service is conditioned on your acceptance of and compliance with these Terms. These Terms apply to all visitors, users and others who access or use the Service.
By accessing or using the Service you agree to be bound by these Terms. If you disagree with any part of the terms then you may not access the Service.
Purchases
If you wish to purchase any product or service made available through the Service ("Purchase"), you may be asked to supply certain information relevant to your Purchase including, without limitation, your credit card number, the expiration date of your credit card, your billing address, and your shipping information.
You represent and warrant that: (i) you have the legal right to use any credit card(s) or other payment method(s) in connection with any Purchase; and that (ii) the information you supply to us is true, correct and complete.
The service may employ the use of third party services for the purpose of facilitating payment and the completion of Purchases. By submitting your information, you grant us the right to provide the information to these third parties subject to our Privacy Policy.
We reserve the right to refuse or cancel your order at any time for certain reasons including but not limited to: product or service availability, fraud or an unauthorised or illegal transaction is suspected, errors in the description or price of the product or service, error in your order or other reasons. You expressly agree that Nebula Automation, LLC cannot accept any liability for loss or damage arising out of such cancellation.
Availability, Errors and Inaccuracies
We are constantly updating product and service offerings on the Service. We may experience delays in updating information on the Service and in our advertising on other web sites. The information found on the Service may contain errors or inaccuracies and may not be complete or current. Products or services may be mispriced, described inaccurately, or unavailable on the Service and we cannot guarantee the accuracy or completeness of any information found on the Service.
We cannot and do not guarantee the accuracy or completeness of any information, including prices, product images, specifications, availability, and services. We reserve the right to change or update information and to correct errors, inaccuracies, or omissions at any time without prior notice. Section "Availability, Errors and Inaccuracies" is without prejudice to existing statutory rights.
Contests, Sweepstakes and Promotions
Any contests, sweepstakes or other promotions (collectively, "Promotions") made available through the Service may be governed by rules that are separate from these Terms. If you participate in any Promotions, please review the applicable rules as well as our Privacy Policy. If the rules for a Promotion conflict with these Terms and Conditions, the Promotion rules will apply. The terms and conditions of any other "Promotions" are independent of this agreement.
Intellectual Property
The Service and its original content, features and functionality are and will remain the exclusive property of Nebula Automation, LLC and its licensors. The Service is protected by copyright, trademark, and other laws of both the United States and foreign countries. Our trademarks and trade dress may not be used in connection with any product or service without the prior written consent of Nebula Automation, LLC.
Links To Other Web Sites
Our Service may contain links to third-party web sites or services that are not owned or controlled by Nebula Automtion, LLC.
Nebula Automation, LLC has no control over, and assumes no responsibility for, the content, privacy policies, or practices of any third party web sites or services. You further acknowledge and agree that Nebula Automation, LLC shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with use of or reliance on any such content, goods or services available on or through any such web sites or services.
We strongly advise you to read the terms and conditions and privacy policies of any third-party web sites or services that you visit.
Termination
We may terminate or suspend your access immediately, without prior notice or liability, for any reason whatsoever, including without limitation if you breach the Terms.
Upon termination, your right to use the Service will immediately cease and all provisions of the Terms which by their nature should survive termination shall survive termination, including, without limitation, ownership provisions, warranty disclaimers, indemnity and limitations of liability.
Indemnification
You agree to defend, indemnify and hold harmless Nebula Automation, LLC and its licensee and licensors, and their employees, contractors, agents, officers and directors, from and against any and all claims, damages, obligations, losses, liabilities, costs or debt, and expenses (including but not limited to attorney's fees), resulting from or arising out of a) your use and access of the Service, or b) a breach of these Terms.
Limitation Of Liability
In no event shall Nebula Automation, LLC, nor its directors, employees, employees, partners, agents, suppliers, or affiliates, be liable for any indirect, incidental, special, consequential or punitive including without limitation, loss of profits, data, use, goodwill, or other intangible losses, resulting from (i) your access to or use of or inability to access or use the Service; (ii) any conduct or content of any third party on the Service; (iii) any content obtained from the Service; and (iv) unauthorized access, use or alteration of your transmissions or content, whether based on warranty, contract, tort (including negligence) or any other legal theory, whether or not we have been informed of the possibility of such damage, and even if a remedy set forth herein is found to have failed of its essential purpose.
Disclaimer
Your use of the Service is at your sole risk. The Service is provided on an "AS IS" and "AS AVAILABLE" basis. The Service is provided without warranties of any kind, whether express or implied, including, but not limited to, implied warranties of merchantability, fitness for a particular purpose, non-infringement or course of performance.
Nebula Automation, LLC its subsidiaries, affiliates, and its licensors do not warrant that a) the Service will function uninterrupted, secure or available at any particular time or location; b) any errors or defects will be corrected; c) the Service is free of viruses or other harmful components; or d) the results of using the Service will meet your requirements.
Exclusions
Without limiting the generality of the foregoing and notwithstanding any other provision of these terms, under no circumstances will Nebula Automation, LLC ever be liable to you or any other person for any indirect, incidental, consequential, special, punitive or exemplary loss or damage arising from, connected with, or relating to your use of the Service, these Terms, the subject matter of these Terms, the termination of these Terms or otherwise, including but not limited to personal injury, loss of data, business, markets, savings, income, profits, use, production, reputation or goodwill, anticipated or otherwise, or economic loss, under any theory of liability (whether in contract, tort, strict liability or any other theory or law or equity), regardless of any negligence or other fault or wrongdoing (including without limitation gross negligence and fundamental breach) by Nebula Automation, LLC or any person for whom Nebula Automation, LLC is responsible, and even if Nebula Automation, LLC has been advised of the possibility of such loss or damage being incurred.
Governing Law
These Terms shall be governed and construed in accordance with the laws of the United States of America and Michigan, without regard to its conflict of law provisions.
Our failure to enforce any right or provision of these Terms will not be considered a waiver of those rights. If any provision of these Terms is held to be invalid or unenforceable by a court, the remaining provisions of these Terms will remain in effect. These Terms constitute the entire agreement between us regarding our Service, and supersede and replace any prior agreements we might have between us regarding the Service.
Changes
We reserve the right, at our sole discretion, to modify or replace these Terms at any time. If a revision is material we will try to provide at least 30 days notice prior to any new terms taking effect. What constitutes a material change will be determined at our sole discretion.
By continuing to access or use our Service after those revisions become effective, you agree to be bound by the revised terms. If you do not agree to the new terms, you must stop using the service.
Privacy Policy
We may update our Privacy Policy from time to time. We will notify you of any changes by posting the new Privacy Policy on this page.
You agree that they constitute part of these terms. You must read our Privacy Policy before you use the Service.
Contact Us
If you have any questions about these Terms of Service, please contact us through { openExternalUrl(APP_WEBSITE); }} > our Twitter or by { openExternalUrl(`mailto:${AUTHOR_EMAIL}`); }} > email .
);
}
return
;
}
};
================================================
FILE: app/components/Tasks/components/Table/components/tableRow.tsx
================================================
import React, { useMemo } from 'react';
import { makeStyles } from '@material-ui/styles';
import { TableRow } from '@material-ui/core';
import { styles } from '../styles';
import RowCheckbox from './cells/checkbox';
import RowTaskId from './cells/taskId';
import RowTaskStore from './cells/store';
import RowTaskProduct from './cells/product';
import RowTaskSizes from './cells/sizes';
import RowTaskProxies from './cells/proxies';
import RowTaskProfile from './cells/profile';
import RowTaskStatus from './cells/status';
const useStyles = makeStyles(styles);
type Props = {
id: string;
mode: string;
selected: boolean;
store: any;
product: any;
sizes: any[];
proxies: any;
profile: any;
message: string;
platform: string;
// eslint-disable-next-line
variation?: string;
// eslint-disable-next-line
chosenSize?:
| string
| {
id: number | string;
name: string;
};
// eslint-disable-next-line
productName?: string;
// eslint-disable-next-line
productImage?: string;
isRangeSelecting: boolean;
group: string;
onRowClick: Function;
index: number;
};
const TaskTableRow = (props: Props) => {
const {
id,
mode,
selected,
store,
product,
sizes,
proxies,
profile,
message,
platform,
variation,
chosenSize,
productName,
productImage,
isRangeSelecting,
group,
onRowClick,
index
} = props as any;
const styles = useStyles();
return useMemo(
() => (
The One
Simply put, the Men's Nike Air Max 1 is one of the most iconic sneakers of all time, and certainly also one of the most historic in Nike’s catalog. First released in 1987 as a performance running shoe, the Air Max 1 was designed by legendary Nike designer Tinker Hatfield and was the first sneaker ever to feature a visible window to expose the Air cushioning within the midsole. The shoe with “maximum Air” was an instant classic, loved in 1987 for its bold look and amazing comfort. As Nike’s running technology progressed, the Air Max 1 became obsolete as a performance running shoe, but its status as a casual favorite seems to increase with each passing year. Released in a countless number of colorways, materials, remodels, and reconstructions throughout the years, the Air Max 1 ranks with the most popular sneakers for men, women, and kids across the globe. Truly, no sneaker collection is complete without a pair.
The Style Is Clear
If you’re looking for a sneaker with all-day comfort and classic style, you need to look no further than the Air Max 1. Always in production and always being released in new colorways in addition to the much-anticipated return of original colorways from time to time, Foot Locker is confident that everyone can find a version of the iconic sneaker to match their own personal style. From the original mesh construction, to leather and suede makeovers, to eye-catching graphic-covered editions, the Air Max 1 can definitely do it all thanks to its clean lines and timeless silhouette that can be worn with virtually anything. Whether it’s your first or fiftieth pair, the latest Air Max 1 releases are ready and waiting here at Foot Locker in a wide range of men’s sizing. Pick up a fresh pair and start walking on Air today.
• Mesh, textile, leather, and/or synthetic upper. See each style for specific construction.
• Low-top silhouette with high-profile midsole for classic Air Max 1 design.
• Foam midsole for lightweight cushion.
• Large visible Air unit in heel for signature look.
• Waffle rubber outsole for durability and ample traction.
Women's shoes are made on a narrower last (the foot-shaped form used in making shoes) than men's. In addition, the heel on a woman's shoe is narrower than the forefoot width. Men's shoes have the same width at the forefoot and heel. The medium width for women's shoes is B, while the medium width for men's shoes is D.
\nWomen can wear men's shoes by converting their size to men's by subtracting 1.5 from their numeric size. For example, if you are a size 8 in women's, you would try a 6.5 in men's sizes. This is a loose conversion and doesn't change the difference in width and forefoot-to-heel ratios.
|If you still have questions about fit or sizing please contact Customer Service.|If your measurements fall between two sizes, choose the smaller size for a tighter fit or the larger size for a looser fit.", variantAttributes: [ { code: '22481626', displayCountDownTimer: false, eligiblePaymentTypesForProduct: ['CREDITCARD', 'GIFTCARD', 'PAYPAL'], freeShipping: true, freeShippingMessage: 'Free Shipping', isSelected: true, launchProduct: false, mapEnable: false, price: { currencyIso: 'USD', formattedOriginalPrice: '$130.00', formattedValue: '$130.00', originalPrice: 130, value: 130 }, recaptchaOn: false, riskified: false, shipToAndFromStore: false, shippingRestrictionExists: false, sku: 'B1998100', skuExclusions: true, stockLevelStatus: 'inStock', webOnlyLaunch: false, width: 'Width - D - Medium' }, { code: '22028090', displayCountDownTimer: false, eligiblePaymentTypesForProduct: ['CREDITCARD', 'GIFTCARD', 'PAYPAL'], fitVariant: 'truesize.gif', freeShipping: true, freeShippingMessage: 'Free Shipping', launchProduct: false, mapEnable: false, price: { currencyIso: 'USD', formattedOriginalPrice: '$130.00', formattedValue: '$119.99', originalPrice: 130, value: 119.99 }, recaptchaOn: false, riskified: false, shipToAndFromStore: false, shippingRestrictionExists: false, sku: 'O1021102', skuExclusions: false, stockLevelStatus: 'inStock', webOnlyLaunch: false, width: 'Width - D - Medium' }, { code: '22035503', displayCountDownTimer: false, eligiblePaymentTypesForProduct: ['CREDITCARD', 'GIFTCARD', 'PAYPAL'], fitVariant: 'truesize.gif', freeShipping: true, freeShippingMessage: 'Free Shipping', launchProduct: false, mapEnable: false, price: { currencyIso: 'USD', formattedOriginalPrice: '$130.00', formattedValue: '$109.99', originalPrice: 130, value: 109.99 }, recaptchaOn: false, riskified: false, shipToAndFromStore: false, shippingRestrictionExists: false, sku: 'O1021023', skuExclusions: false, stockLevelStatus: 'inStock', webOnlyLaunch: false, width: 'Width - D - Medium' }, { code: '22088968', displayCountDownTimer: false, eligiblePaymentTypesForProduct: ['CREDITCARD', 'GIFTCARD', 'PAYPAL'], fitVariant: 'truesize.gif', freeShipping: true, freeShippingMessage: 'Free Shipping', launchProduct: false, mapEnable: false, price: { currencyIso: 'USD', formattedOriginalPrice: '$130.00', formattedValue: '$130.00', originalPrice: 130, value: 130 }, recaptchaOn: false, riskified: false, shipToAndFromStore: false, shippingRestrictionExists: false, sku: 'Q9965100', skuExclusions: false, stockLevelStatus: 'inStock', webOnlyLaunch: false, width: 'Width - D - Medium' }, { code: '22150657', displayCountDownTimer: false, eligiblePaymentTypesForProduct: ['CREDITCARD', 'GIFTCARD', 'PAYPAL'], fitVariant: 'truesize.gif', freeShipping: true, freeShippingMessage: 'Free Shipping', launchProduct: false, mapEnable: false, price: { currencyIso: 'USD', formattedOriginalPrice: '$130.00', formattedValue: '$109.99', originalPrice: 130, value: 109.99 }, recaptchaOn: false, riskified: false, shipToAndFromStore: false, shippingRestrictionExists: false, sku: 'T1623001', skuExclusions: false, stockLevelStatus: 'inStock', webOnlyLaunch: false, width: 'Width - D - Medium' }, { code: '22215929', displayCountDownTimer: false, eligiblePaymentTypesForProduct: ['CREDITCARD', 'GIFTCARD', 'PAYPAL'], fitVariant: 'truesize.gif', freeShipping: true, freeShippingMessage: 'Free Shipping', launchProduct: false, mapEnable: false, price: { currencyIso: 'USD', formattedOriginalPrice: '$130.00', formattedValue: '$99.99', originalPrice: 130, value: 99.99 }, recaptchaOn: false, riskified: false, shipToAndFromStore: false, shippingRestrictionExists: false, sku: 'T1624001', skuExclusions: false, stockLevelStatus: 'inStock', webOnlyLaunch: false, width: 'Width - D - Medium' }, { code: '22311041', displayCountDownTimer: false, eligiblePaymentTypesForProduct: ['CREDITCARD', 'GIFTCARD', 'PAYPAL'], fitVariant: 'truesize.gif', freeShipping: true, freeShippingMessage: 'Free Shipping', launchProduct: false, mapEnable: false, price: { currencyIso: 'USD', formattedOriginalPrice: '$120.00', formattedValue: '$109.99', originalPrice: 120, value: 109.99 }, recaptchaOn: false, riskified: false, shipToAndFromStore: false, shippingRestrictionExists: false, sku: 'U4713001', skuExclusions: false, stockLevelStatus: 'inStock', webOnlyLaunch: false, width: 'Width - D - Medium' }, { code: '22412733', displayCountDownTimer: false, eligiblePaymentTypesForProduct: ['CREDITCARD', 'GIFTCARD', 'PAYPAL'], freeShipping: true, freeShippingMessage: 'Free Shipping', launchProduct: false, mapEnable: false, price: { currencyIso: 'USD', formattedOriginalPrice: '$130.00', formattedValue: '$130.00', originalPrice: 130, value: 130 }, recaptchaOn: false, riskified: false, shipToAndFromStore: false, shippingRestrictionExists: false, sku: 'A3863101', skuExclusions: true, stockLevelStatus: 'inStock', webOnlyLaunch: false, width: 'Width - D - Medium' }, { code: '21939053', displayCountDownTimer: false, eligiblePaymentTypesForProduct: ['CREDITCARD', 'GIFTCARD', 'PAYPAL'], fitVariant: 'truesize.gif', freeShipping: true, freeShippingMessage: 'Free Shipping', launchProduct: false, mapEnable: false, price: { currencyIso: 'USD', formattedOriginalPrice: '$120.00', formattedValue: '$109.99', originalPrice: 120, value: 109.99 }, recaptchaOn: false, riskified: false, shipToAndFromStore: false, shippingRestrictionExists: false, sku: 'J9927100', skuExclusions: false, stockLevelStatus: 'inStock', webOnlyLaunch: false, width: 'Width - D - Medium' } ] }; export const getStockZgw = { id: '19399019_fl_enus', model: { id: '337139_fl_enus', modelWebKey: 22464821, companyNumber: '21', banner: 'Footlocker', languageIsoCode: 'en-us', active: true, number: 337139, name: "PUMA RS-Dreamer - Men's", description: 'When it comes to your hoops game, there’s no reason not to dream big! The PUMA RS Dreamer takes all the best-in-class features from the RS-0, RS-100, and RS-X sneakers and transitions them into a performance basketball shoe that will take your game to a whole new level.
Women's shoes are made on a narrower last (the foot-shaped form used in making shoes) than men's. In addition, the heel on a woman's shoe is narrower than the forefoot width. Men's shoes have the same width at the forefoot and heel. The medium width for women's shoes is B, while the medium width for men's shoes is D.
\nWomen can wear men's shoes by converting their size to men's by subtracting 1.5 from their numeric size. For example, if you are a size 8 in women's, you would try a 6.5 in men's sizes. This is a loose conversion and doesn't change the difference in width and forefoot-to-heel ratios.
", sizeChartImage: 'sizing_blank.jpg' } }; ================================================ FILE: app/tasks/footsites/mocks/submitCheckout.ts ================================================ export const submitCheckout = { preferredLanguage: 'en', securityCode: '', deviceId: '0400tyDoXSFjKeoNf94lis1ztrjQCvk297SBnrp/XmcfWoVVgr+Rt2dAZIo7BJIRIWDNtjiuvPP9Vk+xH1ZPRIwM6njw/ujAyYdbGKZt5JLThTvosS1xgSAgNfLEMokGoGJxpGDm0GL4UJnlxayGiVf3WGA73rYZtIsVyoA80pXCaXaHarNYAXR7cNC1UJgA1BQZDi8R6wVNV9r6qoxEqm2gQ71/Y9e8eiB47caT1pbMLWprU/7qe/2g60jXzk77ILZ/eUsQ7RNrLro1kTKIs1496YkpIh3A707lm2e25SQbo1Nahvu1nnvSP6dYfFIGMH4xTn3Cs8SNRaHmY1XpDGBtyepPcth3j49FFCULIOtw8NjgGLIz85+FaKOKloyCXYm+c/iubjQ5WqGLdwNbC7Fdqs7JQVqOLm0ZRpDrFBxmcvvb8RzWdzZK4RpNGfQbU0JlfhyrSbxA8f904hiAcL/dBjV9nBJW1Y3JLACqjtcRnAvzJ1F0W5Ivre9RJsn4u3PdHf7WUtiodkQcuZj4UInV4IHVSDUBYYdlzBRxN5nDyWopQs/EGzmZL3buGzCBOMr8kI2BeY/fnNTkY08rRcs5IwQxSxzPuRtycb0H5IjHkCcKSs4KVYKB4p8ICkH/4CLq+Tp+QmlT5YNHDo0vYYDC3xqkbjiKwBZfdLDs+1JC1RHeqz7TtH33U6Ua2oeVSZ1SFgzzHSahZXK8hZCSHGBUGQbz44XiMf/eY92hNSmr+k28EssPaX5qs0RLBHR6Vfm/Ep48DVRl0oBkPCJz7Ln+v5KTIBvOIMzuTzEBdNLiXsPV6scyeMvquKgBCHz1/QUZbZ+NCYNO3AHcIII2ayAqc5YwJVsFx3E/58zGq/hZ0ZoyseD0G1/ThxEIvsJRqGfF9spFd7LTpxiIVb7/dLR/aeq024GYThb6+Z4baa9a0Da8VDdLGBfK9PH/LgnAtMTg/gz07uVSINAgzJ8FJa/++5dWoUSzxwidX7pB0s6DSZZLQ6vcEosPoTwXWR3FCKmF00vuc1Ja0zut5yqdw6P3sPPfUZlVQumQs7plNFojmfXEWYy4hOUEbwEEc7mpXuWoRgEqSehE5i26VZ6DLftJSXqGE3lSFVRUBqVHq2r3awuh/3nRbiSbHgfJ/zck+QEC91vDzq9GxxVn+WvCwoViHULgwe4ejOQ9IF9wOHABPWNq9K72wUVXedwTidneZ5WeqDQRJDWdY1fPPyDe+XjcmIrr+l3H+CrCh/wOwAK+J4NSD7VpixCC9XMOJ4AFN/rsIxQFaXCyYsh09NQBEH8RydOTIGfedes7', cartId: 'f34ad606-6016-4ebb-bfa7-0d57b49f5c13', encryptedCardNumber: 'adyenjs_0_1_18$AqJNli55aEZouiHn+RfavvwR3s1WRKgedE5cM38ASQagj/9uQ/pODq98ClDhWMNlIm9y15n5Rmwtro8J4kLXrLc3BhSB65l02aEmZE/YUaQjBXBYNp28YEb+uZVY01IEh9VXXz27IlyzpEOVS4Np/3P2leAcBqgizWIVOwgBhzp141tYVsQV+D1YCdV6l7kOLY6JJ4w+x8T0nDqsSGYtbfw7yKwxaoRAtXWwd0rFtXvv6K+SINSuv6xqt28VnCxhPraAYW/DNGpf2dBMN7KSlQfmgzO2uii+3Ro0TGCJ1Hf1AoyoWkTsR70MnAf1j2wquosPNi6uKt2YKMy+wb+XuQ==$KaknAu6juz4Kmq6DXnUOWIIMs0qT7oC5HSg9naRmvMtqBDB0JRU6n0Tau6rE5LfsuGezvd+N0puyinhLtL+9sLiyZB73gk3P5aP5AM47CRYNsTRd/aphZsZn6cTaKJtnpk5FBC5KWFMnOpzBdd7YpZx8hmVWHoS/a5tPvMZsCpU4xj48s/Na635hjwdCQ958t+qI83KsTDyPxhaoWAVOKGwI6twK98d5Hjx6JHy6gK0lDBcKp/7uTdEuUOOLofksc6V6G44728/uMwdNuSlW5wnmdOTm2ZW76CV9UrtV0/pfkbIyhbBLYFrHTshid/xNtaJzjl2gRssMiIdCUeOniTUJYRb3CSf/X64YLqhpXyFnkcJOft6pdMoEVt906UFTgfX/9tj7pdrhp9eVi2BGSiUzniapOKMmiUEdrFQuK3FnMn8SzdwjM8Mf02JyJnTpFQmrsN9sfZX7/xtS3Q==', encryptedExpiryMonth: 'adyenjs_0_1_18$ZgEs5BZTHqV7kGJcG8FwDWvORyVKnDKgdVEqbsuGWKW2X5hkQXi1q6iGEWPuyDrHnj8+bTybKfALHknnxudwWkKbGNneSodxqf7rg5GaNWnbHqbQehGkbItxzjctM0gMJWTFo3azIaxOcZk2QP3DqkqgFytCFHQHiUkzOhhOHKim8YrBvfBXqpGmKqNgeGGFrNBG+coZwxMenoZu18F5COA54VhiM2ur/DOxFMloegEz+pzggbJ1y8czVX3f6EJLVYolLA0e1KU5Zw9XMd49S9lqO5B4NaPAxYF24rpGFNUmNzKrUyvgKrblZUrAXNBx+sM6HV14kY4xjcRz326zOw==$OzGuAb2flnnr7202rDc+BxuWFuQBFaSDFcZ6YKAb9sGG7kqB2X7Pm1JRFsAps2HScpnZ3Bcz+GFvT9O5uArSy3E/CkAIczEbwo2ioDpLm3+klAingVDrJ7N8chVoZXj4EuKK8zdXlGDHBWK1xJMJRTqlftE7ikeZ+1w7BlxtHCoOevnNAvYCZ+9PKpkifTGS/k76s8kRVJBvjuOAyz9jy1K23fcB/wGvsuisQwyuUxBfzcHduTyekSHdGrEPuvLD35uFD4eglDizuJq/fP+aLNATfOfhUdrKYIXg2MKkVPCoqaD7Fg6Nvwsq7K3G4BqpyuNSQL5wOCK+BpOOqC79+Ug=', encryptedExpiryYear: 'adyenjs_0_1_18$AtO8lPJiC7HIwJuFUXRBGe8JUKbRsTbH14SceA8dOSjsouO10+lyo0+is7Wksh4PTa6kNuy0/zSXwogtpmriOsTfwaM/kXi94scTCCjz6ayn/G+p4hMV1NgaInJU6ic1eWx8G/baoosDuUB07y/VOj5KFdxbDmcIQeRhiKKSHN31t0dOhUFysLApPLNDzX57K07wcTu6cPsOZEvlwSC6P+gKzChykZ1Aw8zozilcTD68fPg5vwXyykHuTJc6KYH7isN+d5OYa0gda0Qbg0goVa8KPmQjXS8zEZCNmXbGN7vEqxe+1CFnk39rWSLshsxTQs4tf6MmGKPxCiSnWum3aw==$p7KmTCshZsLCGlBzPuhXkcAowPcmjkvUFt3XQM6W66ZzxJ+EeSg4V1TwLy3gnxl7ALcONNSHY9pmiFxJEWuNpO5XtqCHPFneSMcPseU/tjtkmKPiE7rPqYMDAFlVEpGLJOa74Cmy8T4VJBa11CtTzomFviz1vuvE0Z13+gr/2VeAtnxe71siS8LvDmom6yTmoxNnJHh5PQRdkmIoczN33SvHDr5d1HlZFcFcQ5p+8ME6nDnKl2VG1UXF7Cm23lxwds+2McrUnv5kuG9vNKzrCUTm6ck8StC5YrmArpZj+UM+5/iKm5YqC5nsOg23V6DLmCIxPYUiphkmFkMXApFAYKkK', encryptedSecurityCode: 'adyenjs_0_1_18$VTvW6ZY5N+bbls/3lhgwt88a5bfNVygdjGMovQJH2Wimh33YOQRv+1D13AsXKDj7yRnTLnrEurjMvYnirXI+c7upL4GbaQiVu/rlV8GtfHQYgyETvnWisColgts5YZzJtP2bz6L6nN1jing6GVMFWSfJZvD0lNH4WnE6LlGXTPYZ0OAJfvku2kiCZ9BfK474oUHwDjzZNpDGlFCSkbRYycvnVgcRzp6SiEGdb9yQbdilvsYpnk+nWtnlDJx61JF1naHmhm7YjBoJL3INAHu8M/GidyT7cnYYEM2KOGIOwgGVHkmiS7S8ukPcoyqRlfPifWE7dhrEmKYnFaD8zOAQHg==$1VwAiJ33nMqMYXI3lXVbUhfO8amK6hDYc+kWeQ9Dq543NQhdn1Q6JriV96TFhgCUOZ/8AlNcC65jjQXi7AYfiwVkVOH940/6zwCTMyO/VQNdXoQuk7e10zBeNInPSPrQQNi4vkjWSFyfLGa9nVpv/xXokcTGAnKnOm/Row7zla//YcNtDwE7xSMumcKfFp/CkTJUiqn3mNLcPhgoYmI34YhC1If6ESNA1C/lHhESO9S1pjktcYx1pDPg4HpV3fJMLPxlZ1BcX+merLj961AIL+oRoLXx2AAqilgEOMdQwA5adokG0DnYD6UvV2iLyFrz51lW1kYh1pV0qg==', returnUrl: 'https://www.footlocker.com/adyen/checkout', paymentMethod: 'CREDITCARD', browserInfo: { screenWidth: 1792, screenHeight: 1120, colorDepth: 30, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', timeZoneOffset: 240, language: 'en-US', javaEnabled: false } }; export const submitCheckoutRequest = { preferredLanguage: 'en', securityCode: '', deviceId: '0400tyDoXSFjKeoNf94lis1ztrjQCvk297SBnrp/XmcfWoVVgr+Rt2dAZIo7BJIRIWDNtjiuvPP9Vk+xH1ZPRIwM6njw/ujAyYdbGKZt5JLThTvosS1xgSAgNfLEMokGoGJxpGDm0GL4UJnOpoZZUO/1x2A73rYZtIsVyoA80pXCaXaHarNYAXR7cNC1UJgA1BQZDi8R6wVNV9r6qoxEqm2gQ71/Y9e8eiB47caT1pbMLWprU/7qe/2g60jXzk77ILZ/eUsQ7RNrLro1kTKIs1496YkpIh3A707lm2e25SQbo1Nahvu1nnvSP6dYfFIGMH4xTn3Cs8SNRaHmY1XpDGBtyepPcth3j49FFCULIOtw8NjgGLIz85+FaKOKloyCXYm+c/iubjQ5WqGLdwNbC7Fdqs7JQVqOLm0ZRpDrFBxmcvvb8RzWdzZK4RpNGfQbU0JlfhyrSbxA8f904hiAcL/dBjV9nBJW1Y3JLACqjtcRnAvzJ1F0W5Ivre9RJsn4u3PdHf7WUtiodkQqPVTy0z53HfRnSAM/1xlXk5AdPyb1uOspQs/EGzmZL3buGzCBOMr8pnKEQEQBxFO6Vws8ecW6ewQxSxzPuRtycb0H5IjHkCcKSs4KVYKB4p8ICkH/4CLq+Tp+QmlT5YNHDo0vYYDC3xqkbjiKwBZfdLDs+1JC1RHeqz7TtH33U6Ua2oeVSZ1SFgzzHSahZXK8hZCSHGBUGQbz44XiMf/eY92hNSmr+k28EssPaX5qs0RLBHR6Vfm/Ep48DVRl0oBkPCJz7Ln+v5KTIBvOIMzuTzEBdNLiXsPV6scyeMvquKgBCHz1/QUZbZ+NCYNO3AHcIII2ayAqc5YwJVsFx3E/58zGq/hZ0ZoyseD0G1/ThxEIvsJRqGfF9spFd7LTpxiIVb7/dLR/aeq024GYThb6+Z4baa9a0Da8VDdLGBfK9PH/LgnAtMTg/gz07uVSINAgzJ8FJa/++5dWoUSzxwid+LfutAyDpla8r/MEOe97HHaf4sdgpV81fO8omXIFEISadmHTp3K02sZEbEKreHExPP9vZGbS6o838alSpm8Ohb8qaR/41v6XRgEqSehE5i26VZ6DLftJSXqGE3lSFVRUBqVHq2r3awuh/3nRbiSbHgfJ/zck+QEC91vDzq9GxxVn+WvCwoViHULgwe4ejOQ9IF9wOHABPWNq9K72wUVXedwTidneZ5WeqDQRJDWdY1fPPyDe+XjcmIrr+l3H+CrCh/wOwAK+J4NSD7VpixCC9XMOJ4AFN/rsIxQFaXCyYsh09NQBEH8RydOTIGfedes7', cartId: '340547585', encryptedCardNumber: 'adyenjs_0_1_18$BVVV6AQDIVgr3tRstL5M8UGBJ4eucoswmO/2/6E6ogwaiDqEMa0jOEeei9wbdjESqXVBVEA15vsilz1Hq9xNh7yEmDA13gfDkfEBFFUi63mSA7s6zIbRLjUI7TJ2OR2AZ+Dv1Bys3y7yyuDntlsk1tjTGCuIwYlwtnxyLYas4ygrKPqfcNNWKnRmHSh4elzJnkohSzDqjFbWIV7LwdJ0QKgJWJzZ97dZ0dgewrM5xPETms4pcYg5LO89nwBvK9jgLnvCGVUmpqJLtZvXtVQWfOdb78nG+LYP9KT2Q2TwZDxpMu+EjIiAJlKWyiS+XyEPyPXDtKKlRbJLTn1KqTWf9g==$pqRgj6/qs14jWqBGYQccscdMPhtAhWb7OPi4C6P59jQNwvvjGoZ9DeI19ICgMxWG1on1PaLAlfxEzzcacL28ditkylUFq0wwx2668vk8nDxIlePwdTStMDByPDujF8GYJ+TEXzShkxbhEr3XlnRcuXY61ZnQHpopKm83U0swQ29F4jqZygSlkQh7WGJybwrCp8PbKULLz++wcnSCPcM43fSyVApo8H6q5LRpKLUd6yT9CcAptODqJkVrgF47VCE3u6+WUWUh1M6gKpYgStaBr2irBgI6G95FPdUNoB8V9nO0uKEObHlU1PbnFw47WfOpUyB/065AxkrYN8A6OBrnDxsywkAPf5RgEQ96rqc9Cs3VuJLv/mGJi2fYgGyIsHO8X+1pBD4+nmp2yae0kx7ymjR9fuHwq+ijB+syf2GZmU7WQcAJyxZzfhTOnDBqtCesAzklMqHF1Phy3k2pPtY=', encryptedExpiryMonth: 'adyenjs_0_1_18$lor5BnwhdATxLrHK5kV56bLgjtGZzeDd0Rh3en6KhzP8o3DcRFlC59qWXeAv/jZkl24+Gz1R8n3+LwtMEOmXyTrpwFYeuMD1W/wU7pn4PdUJg/ZdbmX2Ltj2FfKGmdCqjDHF/mMtgCzogYdq+vnRkFJsAOjNweqXgFVuHbjieEsdUVolosNYAIEbgvtEP3WzO7hdLYMeU/8Hwwr/Tv8VYWnz0fhZyx4LEvTq7uc7A6rHcrY/S+LfHXNxR/7WjauHVoWwXBClV6MipJbJnX5wvorOKxydGcsTiXhi30VXAADSLtH41uyxojNmsWFw3MJGfi12PbXiFEmo2OGAyvOgGA==$iYGXenOhk3Ak04AWbRtUnx5xZ6e6PQ6rCDB2qXFc6oeQq0ushnKOLf3uUoZbr2qSyWhPC0xpqCgOYOKFmQRCKmW+Q0sR3NTsnpza/5dWbGxPxl9xAFP5Gp1REDjWlklAo/R/JTwVnCsX10vXnbi010Znh+kigSghW2iYeReUgxfv1yIxloXUImy/j5aG4batpimmRf1FVM1usFa/wtE0D0xb1mzxNSVk8Wq3+AR0eKK2yrKlVh9rXUiTKIhQQlWP6u6Myl3s/Y7UPK6JAukYvUgyZZtgDd9wNk0GpM+8JTHsHLOa4A0wV9cn4UY711U4pXQBxx0eelP2sEdHg6bZBtw=', encryptedExpiryYear: 'adyenjs_0_1_18$b3KZmpx3DZ2leg6k33HCzNjK1A5eFZ94BWtKqrmIDZkYerc+mUQrHzhhzk65PS60X7TvdSgF7KR7TBWti68Xo2dqUkspWU3ayoEyYjUIL9qC2QRwr9xB0jJSVhW+I+8dY+wwmxH2bV47P+jRjJDiPIqOWn1HVTjE9zaXvGQ/3X5NqSiFqxiDcqKodJ7lC9xSUPvBUiCmkNKGGQcIsXgpAulP8Nci7DmBFK02cZpChSGpDJaTqMCpEN80/O3cyMwbZa1unXsSYJkUtoFJr53l/8i54x2+qGU13zngvegEGqzbjIf4nVVi4fjPSGuY55iQ2/McT7aenfy6N7l1MBtP3A==$GPnBijSJj6tnE1ANQnhE0W0Z3mHcJA+21mXNmMA9Kbrlh4NyElL+tKySTLAb8V3ud+jby+UeMGhyYiUALFox860EPx987X1q31eylWdrkP0qefWZmbkpMzfHIV6akB2o2oz18bvHpSFvxuSbMQmMFf/5V5A/WRae+eq+N8gI4EjQElkQMFiRtqrO0rdzB9dsWeR55teD0nKa1RMf4EO3vhTCs9gZcmbBxdfyMkitrYAn2bVBm468ZZvT1XwYKAG7rNV0UUNoaV2BmCswpmNtmzzhUrPbCnZP7gx/xFIhcGjXwzMRIdsDz+PEHAO+tyN1QZy+GzrJ1xmADOe8p2UzhgeW', encryptedSecurityCode: 'adyenjs_0_1_18$BIVyZ1HViER9i0bY4m4f2RbDPv7rilHD2cHWdaUaGSpyrm4FtnSRkoYnO6/nOTCYhrMuAZNdp+wWn14wbeDbIKa0FIZd76+qqA+x8mQlHQPvF87y7B7gi9uBQo5XRNTaj1irB+Y7aCiFPGz6WG33KXjY6sLfAaPl3zkpNo1Chz1wkAwERUYdUpVsPqTe1wu/5Hw+IL6atCvCv/jJz6YEbEuYi6tCbsYVc7Mqo7vJ9raOz+p5cyTbZ0nPpuhWg1KLbW5V1XeCdSe8SCngTg1ptjAra0UV9QWcVaZ6/UBmXP8ttL0x6MSEBKvFJM+m/0dAXTciNPhnUaTtFWK1eSoHgQ==$VQLAPfKT23KIe+td6YEDdZvZZjuPqhMb/USNlggytbcJvtTsFdT56k9L7XloRFN9k3PzKSLAt5eaQ9t+pRxjDWrw6cRSH+ZtfZAshGA1JJRI/SKAOg3762XdIZI6Z8AGoJBxmp5KmyMm3Xz3PhE1ouzr+JVxfFyotAg8PY4qzhzRHWHDd4klBpSeSRiiiSbLe/NmpVUzDNyc/dKUt5+m7YCwS5y/ZgnIgJDqIghGAtLE290KQ8CiWT/QD7IdjflIZuU7UmhBT09bSbGqDHeUcaMSoj3umPolIifdLBZc4/vfpQAMdM1mO8fINWqs4HfqOxtY8/ltVk9AVw==', returnUrl: 'https://www.footlocker.com/adyen/checkout', paymentMethod: 'CREDITCARD', browserInfo: { screenWidth: 1792, screenHeight: 1120, colorDepth: 30, userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36', timeZoneOffset: 240, language: 'en-US', javaEnabled: false } }; ================================================ FILE: app/tasks/footsites/mocks/submitInformation.ts ================================================ export const submitInformation = { billingAddress: true, country: { isocode: 'US' }, defaultAddress: false, firstName: 'John', id: '16804152868887', lastName: 'Smith', line1: '123 test blvd', phone: '5555555555', postalCode: '10020-3632', recordType: 'S', region: { isocode: 'US-NY' }, setAsBilling: true, shippingAddress: true, town: 'NEW YORK', visibleInAddressBook: false }; ================================================ FILE: app/tasks/footsites/utils/__tests__/pickVariant.test.ts ================================================ import { pickVariant } from '../pickVariant'; import { sizes } from '../../mocks/getStock'; const getLogger = () => ({ // eslint-disable-next-line debug: console.log, }); // keep always the same order jest.mock('lodash', () => ({ ...jest.requireActual('lodash'), shuffle: (arr: any[]) => arr })); const { variation_list: variationList } = sizes; it('should match size 7', async () => { const sizes = ['7']; const testVariants = [...variationList]; const size = await pickVariant({ variants: testVariants, sizes, logger: getLogger(), id: 'test' }); expect(size.id).toBe('7'); }); it('should match size 7.5', async () => { const sizes = ['7.5']; const testVariants = [...variationList]; const size = await pickVariant({ variants: testVariants, sizes, logger: getLogger(), id: 'test' }); expect(size.id).toBe('7.5'); }); ================================================ FILE: app/tasks/footsites/utils/cleanseHeaderData.ts ================================================ export const cleanseHeaderData = (headers: any) => { const cleansedHeaders = { ...headers }; const excludedHeaders = [ 'content-type', 'accept-ranges', 'date', 'content-encoding', 'access-control-allow-origin', 'access-control-allow-credentials', 'dnt', 'expires', 'origin', 'sec-ch-ua', 'sec-ch-ua-mobile', 'sec-fetch-dest', 'sec-fetch-mode', 'sec-fetch-site', 'strict-transport-security', 'set-cookie', 'x-csrf-token' ]; excludedHeaders.forEach( (headerName: string) => delete cleansedHeaders[headerName] ); return cleansedHeaders; }; ================================================ FILE: app/tasks/footsites/utils/dfValues.ts ================================================ /* eslint-disable no-bitwise */ export const randomItem = (items: any[]) => items[~~(items.length * Math.random())]; const values = [ 'ryEGX8eZpJ0030000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTExMpCOWWM8ZRqPdS8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004SRE3NcgP6100000qZkTExMpCOVbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000KZbIQj6kzs0057161880cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'HzpCi2lVV00020000000000000LOziC3ZM670050271576cVB94iKzBGREOo5PUjZGswEtLkIt160025zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0031498296cVB94iKzBGhbWHBHV9fE5S16Goh5Mk0043dP7nbjU0u00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTExMpCOPRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670032321312cVB94iKzBGq3d7ctksIz1B2M2Y8Asg0006AcncXOpKB00000YVxEr00000UhiWo2YDS38bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0031498296cVB94iKzBG0GncDpr5Mt5S16Goh5Mk004QGyEPNcuVI00000YVxEr00000WWM8ZRqPdS8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGiBnGvWGLXE1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBG0GncDpr5Mt5S16Goh5Mk004NMWer10CgS00000YVxEr00000WWM8ZRqPdS8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0060824190cVB94iKzBGUfk9f0dK795S16Goh5Mk004ivbSuYdG0R00000YVxErxMpCOcru9sAxTR58bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008809056cVB94iKzBGXsjnIPInE81B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'DGygn5fxoI0030000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvHQJWV6m1Lzq0055zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'SfkuFbbuXV0040000000000000LOziC3ZM670050271576cVB94iKzBGLjsH1QZZVoswEtLkIt160029mrpzA0YDj00000YVxEr00000kcmQ1fs6Kr8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'IrULyfba9g0010000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvHeuGX3MfJpT0025zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'q7ybAfUCXE0010000000000000LOziC3ZM670031498296cVB94iKzBGmDucNZFl56kfFkZiNCJG003eRVXqAZKsJ00000YVxEr00000jUVtiFCq5Z8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGt5t5NLXhjb1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0022455576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTExMpCOPRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTExMpCOPRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008809056cVB94iKzBGGp9fZUg6GG1B2M2Y8Asg000lwLidkEa8i00000082Ii00000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0089146776cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0008346480cVB94iKzBGmwU6eS6MQ91B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0009040344cVB94iKzBGAmaG6DGRlM1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008809056cVB94iKzBGGp9fZUg6GG1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '36cMbcuFZD0030000000000000bsx09CX6tD0050271576cVB94iKzBG5fBQBEyytB5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670089146776cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0099004056cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004pafY3RKPsq00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0099004056cVB94iKzBGzk6emGsPvH5S16Goh5Mk004nRLMPeG81l00000qZkTExMpCOPRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0119707416cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0039372870cVB94iKzBG1BcuXJqExI5S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670031498296cVB94iKzBGWTB2TozEq95S16Goh5Mk004zlfNzRaJT200000YVxEr00000cru9sAxTR58bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000BTWDfYZVR30050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000BTWDfYZVR30050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0028967400cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670050271576cVB94iKzBGA0Gzl7BUep5S16Goh5Mk004P5GcncoZnv00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000KZbIQj6kzs0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTExMpCOPRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ00300000000000005B8Gc9qXKS0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000KZbIQj6kzs0031845528cVB94iKzBGWluM04lRn75S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0128209560cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTExMpCOPRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGE29FfsTXbQ1B2M2Y8Asg000bV1RVY6TcX00000hn5Xv00000R1KIT2QiIg8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0079343550cVB94iKzBG1BcuXJqExI5S16Goh5Mk004ivbSuYdG0R00000YVxErxMpCOcru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010009696cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000zD6kLsGI2i0012165216cVB94iKzBGDiTafU5Ef11B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGCIrjsrDTmG1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000geWHbMHOA20039372870cVB94iKzBGiwl0FL4Vy05S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBGDiTafU5Ef11B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000LOziC3ZM670050271576cVB94iKzBGQkPFutk01m5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGDiTafU5Ef11B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000PRlpbD8Nw38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGDiTafU5Ef11B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010011456cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000geWHbMHOA20012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000BcYjP5Kj2S8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGMwFkzkpCD31B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010009696cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010009696cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010009696cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005L7iGrdXwD0010011456cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005L7iGrdXwD0010011456cVB94iKzBGYT20de2be21B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000pgIOdGFwF00012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000CEENawQ48p0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGDiTafU5Ef11B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000zD6kLsGI2i0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGDiTafU5Ef11B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'XosZDGRh4D0040000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvHswEtLkIt16002zqGr8VzRyP00000qZkTE00000Y6T1i88ZFJ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004SRE3NcgP6100000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000BcYjP5Kj2S8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0089146776cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0008238976cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000duBbAmf7Y700000hn5Xv00000GSz4UPaO7H8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010009696cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000jkdxyjUMSN0010011456cVB94iKzBGDiTafU5Ef11B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010009696cVB94iKzBGGV93wYDCPj1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010011456cVB94iKzBGDiTafU5Ef11B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTExMpCOVbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBG3NVq78ok961B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0025568800cVB94iKzBGHv5elJ7pyk1B2M2Y8Asg000Er39RblXKg00000YVxEr00000KXDjDIKhGz8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000jkdxyjUMSN0008238976cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30010009696cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGDe3FSmdGW81B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0008809056cVB94iKzBGXsjnIPInE81B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBGyE1g46dVeD1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000zD6kLsGI2i0010011456cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBGDiTafU5Ef11B2M2Y8Asg000duBbAmf7Y700000hn5Xv00000GSz4UPaO7H8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010009696cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000duBbAmf7Y700000hn5Xv00000GSz4UPaO7H8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0039372870cVB94iKzBGeT6jSXp3Qh5S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0012165216cVB94iKzBGDiTafU5Ef11B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0006579576cVB94iKzBGS6PcazzvHf1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0031498296cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005L7iGrdXwD0006403416cVB94iKzBGPMHyPE2lwi1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0008809056cVB94iKzBGYGEF6iENFg1B2M2Y8Asg000GhW9lhDGPr00000vwT3800000jf1zKDHFWq8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008809056cVB94iKzBGExMYXLXmAW1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0006650040cVB94iKzBGI1KLRwuM5z1B2M2Y8Asg000PxSvJrLDvC00000vwT3800000re8kzkpUmJ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670010009696cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000duBbAmf7Y700000hn5Xv00000GSz4UPaO7H8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004wQDEbTnhdw00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0008238976cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000jkdxyjUMSN0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0060824190cVB94iKzBGiwl0FL4Vy05S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670006016800cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0008238976cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', 'ryEGX8eZpJ00300000000000005B8Gc9qXKS0042795816cVB94iKzBGxEyajaYoff5S16Goh5Mk004NaIWJODGrk00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBGDiTafU5Ef11B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30008949840cVB94iKzBG3celv0K9M41B2M2Y8Asg000PxSvJrLDvC00000vwT3800000JwzOfwIkpM8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005L7iGrdXwD0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'q7ybAfUCXE0010000000000000bsx09CX6tD0042795816cVB94iKzBGmDucNZFl56kfFkZiNCJG003eRVXqAZKsJ00000YVxEr00000jUVtiFCq5Z8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000zD6kLsGI2i0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000geWHbMHOA20032321312cVB94iKzBGmDucNZFl561B2M2Y8Asg0006AcncXOpKB00000YVxEr00000UhiWo2YDS38bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ00300000000000005B8Gc9qXKS0050271576cVB94iKzBGA0Gzl7BUep5S16Goh5Mk004r11MKsLYnB00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0006579576cVB94iKzBGtltNar4B1c1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008577768cVB94iKzBG5Jv4GqIFQG1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000v4CKntvmGp0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670006579576cVB94iKzBGlmwteBcfrC1B2M2Y8Asg000DUVZiy1x2U00000vwT3800000TQHV0mScHm8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000geWHbMHOA20012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0007431384cVB94iKzBGJklIG2Ddbx1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGCIrjsrDTmG1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000zD6kLsGI2i0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGDiTafU5Ef11B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000lCYuNejGFz0012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0008238976cVB94iKzBGXcpoEuvoS21B2M2Y8Asg0009RkAhURpFP00000hn5Xv000006QM8y8OMxH8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010011456cVB94iKzBGt5t5NLXhjb1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670009271632cVB94iKzBGX8izD6dOKD1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0006579576cVB94iKzBGMQg9CBELHe1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '36cMbcuFZD0030000000000000bsx09CX6tD0025537800cVB94iKzBGdDC7M9mXeF5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004pafY3RKPsq00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000duBbAmf7Y700000hn5Xv00000GSz4UPaO7H8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000zD6kLsGI2i0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'pHDvK98Ty00020000000000000LlDyZ49njD0008809056cVB94iKzBGsc3e9EmFA01B2M2Y8Asg000bGeQTGmQSv00000vwT3800000GZkr05DpDN8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBGt5t5NLXhjb1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670008809056cVB94iKzBGsc3e9EmFA01B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008844120cVB94iKzBGukDZF0cxC01B2M2Y8Asg000PxSvJrLDvC00000vwT3800000bzVZjBGLod8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000YIJgr1MHDD0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'DGygn5fxoI0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvHQJWV6m1Lzq0055zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670039372870cVB94iKzBGDqaXmAywf35S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008085024cVB94iKzBG1EvZmigDH31B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0031498296cVB94iKzBGLjsH1QZZVo5S16Goh5Mk004PC0vDFcN6Y00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008577768cVB94iKzBGDRchhAc1oq1B2M2Y8Asg000GhW9lhDGPr00000vwT38xMpCOqPaYRrVnfp8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010009696cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000YIJgr1MHDD0012165216cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005L7iGrdXwD0010011456cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0057161880cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGPvFe4O6Jgt1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBGDiTafU5Ef11B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGYT20de2be21B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGYT20de2be21B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGPvFe4O6Jgt1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000geWHbMHOA20012165216cVB94iKzBGDiTafU5Ef11B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'YQZl3z9Jth0030000000000000KZbIQj6kzs0050271576cVB94iKzBGr1Nn1yRo2VDWVQyTSR6G0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670119707416cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ00300000000000003Zfb9jyFdr0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0025537800cVB94iKzBGzk6emGsPvH5S16Goh5Mk00464HD5GXZ7Y00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004MzhnzCP2ng00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', '36cMbcuFZD0030000000000000LlDyZ49njD0050271576cVB94iKzBGdDC7M9mXeF5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk00464HD5GXZ7Y00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'YQZl3z9Jth0030000000000000LlDyZ49njD0050271576cVB94iKzBGNDKCJCk4UoDWVQyTSR6G0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'DrkEO6KgzF0010000000000000LOziC3ZM670031498296cVB94iKzBGXDkYEdIW3xG3DvKQfefA003eRVXqAZKsJ00000YVxEr0000072TyU9mipD8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0089146776cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTExMpCOPRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', 'YQZl3z9Jth0030000000000000LlDyZ49njD0060824190cVB94iKzBGRgzkMb5p79DWVQyTSR6G004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004SRE3NcgP6100000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000KZbIQj6kzs0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0031498296cVB94iKzBGTqGeMlklid5S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', 'zOfp75NKmO0040000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvHswEtLkIt16002I8OANlnWyk00000qZkTE00000EGAaKf8sEH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0050271576cVB94iKzBGBhl2N1gIpn1B2M2Y8Asg000BZEFovC2eA00000qZkTExMpCOalNkzqvbrO8bcIu6FDHO:40', 'ryEGX8eZpJ00300000000000005L7iGrdXwD0089146776cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'oXLtz8zkxP0040000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvHswEtLkIt16002Wr7hr2sCSd00000qZkTE00000pRv7LgAO7g8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670076744344cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004nRLMPeG81l00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670089146776cVB94iKzBGzk6emGsPvH5S16Goh5Mk004wQDEbTnhdw00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0025537800cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005L7iGrdXwD0014087256cVB94iKzBG4x0mqstQx01B2M2Y8Asg000xZInw4LDAW00000gg11x00000yuvzlJVC4B8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0089146776cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000BTWDfYZVR30089146776cVB94iKzBGoRIwYKjMaC1B2M2Y8Asg000ZxVV2ylwjJ00000qZkTExMpCOalNkzqvbrO8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0032321312cVB94iKzBGHYHwkj8Tgp1B2M2Y8Asg000daLvDDB8VY00000G5AYG00000PRlpbD8Nw38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000LOziC3ZM670032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTExMpCOVbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670022455576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000jkdxyjUMSN0039372870cVB94iKzBG1BcuXJqExI5S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000jkdxyjUMSN0008079624cVB94iKzBGvtGMQQM43Z1B2M2Y8Asg000GhW9lhDGPr00000vwT3800000JwzOfwIkpM8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0010009696cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0009040344cVB94iKzBGiGb2qqhzdN1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0039372870cVB94iKzBGLjsH1QZZVo5S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0048422616cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000BcYjP5Kj2S8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000pgIOdGFwF00006403416cVB94iKzBGbD0xdzzm401B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0045298016cVB94iKzBGmDucNZFl561B2M2Y8Asg0006AcncXOpKB00000YVxEr00000UhiWo2YDS38bcIu6FDHO:40', 'lWSY9IdZoy0040000000000000bsx09CX6tD0022455576cVB94iKzBGzk6emGsPvHswEtLkIt16002xICkHOEjLF00000qZkTE000005cKfI5BqkY8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670010009696cVB94iKzBGPvFe4O6Jgt1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGBcniYCrDOp1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0009040344cVB94iKzBGAmaG6DGRlM1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670008577768cVB94iKzBG2qzYJmdHRf1B2M2Y8Asg000DUVZiy1x2U00000vwT3800000TQHV0mScHm8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTExMpCOD0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005L7iGrdXwD0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010009696cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000duBbAmf7Y700000hn5Xv00000GSz4UPaO7H8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000002J38D55uSG0008809056cVB94iKzBGsjTGgYvoxA1B2M2Y8Asg000PxSvJrLDvC00000vwT3800000re8kzkpUmJ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGmDucNZFl561B2M2Y8Asg000YZXcXIyJS700000YVxEr00000UhiWo2YDS38bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0008577768cVB94iKzBGuimS3s9ovY1B2M2Y8Asg000PxSvJrLDvC00000vwT3800000bzVZjBGLod8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670010009696cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000CK1aUgqatB0008238976cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000BTWDfYZVR30050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004lfyHqcRDB000000qZkTE00000r5z1dX6eUf8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '4ETDaisV6O0040000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvHswEtLkIt16002WNPhwGdpLe00000qZkTE00000tNZRDg8znX8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670009040344cVB94iKzBGcfDIBCD8pw1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010009696cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670007431384cVB94iKzBGMoHLx7MXCy1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670050271576cVB94iKzBGQkPFutk01m5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0066967896cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0007108056cVB94iKzBGpKJc8x3OVf1B2M2Y8Asg000DUVZiy1x2U00000vwT38xMpCOTQHV0mScHm8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0007920000cVB94iKzBGOSRmQJFLKb1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0024926616cVB94iKzBGLjsH1QZZVo5S16Goh5Mk004zlfNzRaJT200000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010009696cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010009696cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', 'Hob5KkYF6L0040000000000000bsx09CX6tD0089146776cVB94iKzBGzk6emGsPvHswEtLkIt16002GiUoX355Mf00000qZkTE00000U6JwXsbk0N8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670010009696cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000duBbAmf7Y700000hn5Xv00000GSz4UPaO7H8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000zD6kLsGI2i0010011456cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000jkdxyjUMSN0066967896cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000zD6kLsGI2i0010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008577768cVB94iKzBGEK3cqmJmpR1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGBcniYCrDOp1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010009696cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBG8JfQsizpZi1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000geWHbMHOA20050271576cVB94iKzBGQkPFutk01m5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000pgIOdGFwF00012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000LOziC3ZM670031498296cVB94iKzBGLjsH1QZZVo5S16Goh5Mk004zlfNzRaJT200000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBGCIrjsrDTmG1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTExMpCOWWM8ZRqPdS8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010009696cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0010009696cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000zD6kLsGI2i0010009696cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008238976cVB94iKzBGBcniYCrDOp1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000zD6kLsGI2i0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004cxI1vzP3pV00000qZkTE00000isIlMkkXXj8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008577768cVB94iKzBGYnZXS8m7mz1B2M2Y8Asg000DUVZiy1x2U00000vwT38000005psGhbijUS8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000jkdxyjUMSN0010009696cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670008809056cVB94iKzBGXsjnIPInE81B2M2Y8Asg000DUVZiy1x2U00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0008238976cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0008577768cVB94iKzBG1Grc2mSc9Z1B2M2Y8Asg000GhW9lhDGPr00000vwT3800000qPaYRrVnfp8bcIu6FDHO:40', 'M4XZE0bmCb0040000000000000LOziC3ZM670024926616cVB94iKzBGoWdpudhStGswEtLkIt16002eY6kRY6Di600000YVxEr00000gwPuEfmW8d8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0009040344cVB94iKzBGmyAFXRgsRB1B2M2Y8Asg000GhW9lhDGPr00000vwT3800000bzVZjBGLod8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000jkdxyjUMSN0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0011010384cVB94iKzBGKsSAc1eO7A1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000v4CKntvmGp0008346480cVB94iKzBGFBqTjbIoqk1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005L7iGrdXwD0009040344cVB94iKzBGba6MttZG491B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', 'IrULyfba9g0010000000000000bsx09CX6tD0050271576cVB94iKzBGLjsH1QZZVoeuGX3MfJpT002RLj6mN5bZA00000YVxEr0000032Dk1y3j948bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0012165216cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000geWHbMHOA20010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0006403416cVB94iKzBGvP2xEwbpOO1B2M2Y8Asg000QYrm9Q3IN200000vwT3800000bzVZjBGLod8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0010009696cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000PRlpbD8Nw38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010009696cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0008238976cVB94iKzBG5LDLmZGURz1B2M2Y8Asg0009RkAhURpFP00000hn5Xv000006QM8y8OMxH8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0089146776cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000zD6kLsGI2i0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670008346480cVB94iKzBGi0pYvKEbQr1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', 'YQZl3z9Jth0030000000000000LOziC3ZM670089146776cVB94iKzBG9B3Ni8oc0fDWVQyTSR6G0045zgp4q8JSa00000qZkTE00000EljdMBM0Db8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670006579576cVB94iKzBGMQg9CBELHe1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGYT20de2be21B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGyE1g46dVeD1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0010009696cVB94iKzBGt5t5NLXhjb1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0034981176cVB94iKzBGQkPFutk01m5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005L7iGrdXwD0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000BcYjP5Kj2S8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGDiTafU5Ef11B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000BcYjP5Kj2S8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0039372870cVB94iKzBGDqaXmAywf35S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGCIrjsrDTmG1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000PRlpbD8Nw38bcIu6FDHO:20', 'ryEGX8eZpJ00300000000000005B8Gc9qXKS0111433470cVB94iKzBGbThBewXnFM5S16Goh5Mk004RLj6mN5bZA00000YVxEr0000032Dk1y3j948bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670034981176cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGQkPFutk01m5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0005698776cVB94iKzBG8wFGovfg331B2M2Y8Asg000RbVGHz9vJN00000gg11x00000yuvzlJVC4B8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0007920000cVB94iKzBGVkD1iwUsnR1B2M2Y8Asg000yQbjCcwOgK00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000zD6kLsGI2i0012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0034981176cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBGXcpoEuvoS21B2M2Y8Asg0009RkAhURpFP00000hn5Xv000006QM8y8OMxH8bcIu6FDHO:20', '36cMbcuFZD0030000000000000bsx09CX6tD0050271576cVB94iKzBGdDC7M9mXeF5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '36cMbcuFZD0030000000000000bsx09CX6tD0050271576cVB94iKzBGk2iYRW8hrZ5S16Goh5Mk004vS8FHjD27A00000qZkTE00000F2e2nkLQB08bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000CK1aUgqatB0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0032321312cVB94iKzBGRpnAY8DcvX1B2M2Y8Asg000daLvDDB8VY00000YVxEr00000VUKxFcDjif8bcIu6FDHO:40', 'ryEGX8eZpJ00300000000000005B8Gc9qXKS0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk00464HD5GXZ7Y00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670178050456cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0079343550cVB94iKzBGLjsH1QZZVo5S16Goh5Mk004RLj6mN5bZA00000YVxEr0000032Dk1y3j948bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0009181128cVB94iKzBG6pmGLoLH9D1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670053401608cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000Sq3beLDyWH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000v4CKntvmGp0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTExMpCOVbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000geWHbMHOA20012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0007108056cVB94iKzBGP4LmbE5hAS1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0031498296cVB94iKzBGiwl0FL4Vy05S16Goh5Mk004RLj6mN5bZA00000YVxEr0000032Dk1y3j948bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000PRlpbD8Nw38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000IogoWkZQUw0010011456cVB94iKzBGSiBZSarxKD1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008238976cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000duBbAmf7Y700000hn5Xv00000GSz4UPaO7H8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0010011456cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTExMpCOD0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000mu2kjLQvJU0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000LOziC3ZM670025537800cVB94iKzBGzk6emGsPvH5S16Goh5Mk004SRE3NcgP6100000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0006755736cVB94iKzBGz5bRkXOzgu1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008238976cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0042795816cVB94iKzBGzk6emGsPvH5S16Goh5Mk004vS8FHjD27A00000qZkTE00000WWM8ZRqPdS8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670039372870cVB94iKzBGLjsH1QZZVo5S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000BTWDfYZVR30042795816cVB94iKzBGW0vJiZf2hs5S16Goh5Mk004PC0vDFcN6Y00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0007612800cVB94iKzBGAPNE1SDWay1B2M2Y8Asg000vjVlZakNGV00000082Ii00000goZnsaORwN8bcIu6FDHO:40', 'ryEGX8eZpJ00300000000000005B8Gc9qXKS0042795816cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'YQZl3z9Jth0030000000000000LOziC3ZM670050271576cVB94iKzBGMTtXW49rJPDWVQyTSR6G0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000xZXdueIoxW0012165216cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30006579576cVB94iKzBGa33PFxfDsQ1B2M2Y8Asg000GhW9lhDGPr00000vwT3800000bzVZjBGLod8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000xZXdueIoxW0010011456cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010009696cVB94iKzBGyE1g46dVeD1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30008809056cVB94iKzBGQDDaDNcG0H1B2M2Y8Asg000eAruabgWqc00000082Ii00000re8kzkpUmJ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0007920000cVB94iKzBGmYImnV8kNy1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000KZbIQj6kzs0032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'VTzMpELI700040000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvHswEtLkIt16002eilMTVeNoL00000qZkTE00000EIsBAPx8Yf8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000CEENawQ48p0010009696cVB94iKzBGPvFe4O6Jgt1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0010009696cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000duBbAmf7Y700000hn5Xv00000GSz4UPaO7H8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0009040344cVB94iKzBG2qXShFNTsw1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008238976cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0012165216cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30010011456cVB94iKzBGDiTafU5Ef11B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000CEENawQ48p0006016800cVB94iKzBGhXdDdxCLI91B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000jkdxyjUMSN0008238976cVB94iKzBGWSU2SyE8ET1B2M2Y8Asg000bV1RVY6TcX00000hn5Xv00000R1KIT2QiIg8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0006931896cVB94iKzBG31wkcDR2gs1B2M2Y8Asg000eAruabgWqc00000082Ii00000bzVZjBGLod8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0009040344cVB94iKzBGNILfrz2WDG1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670009271632cVB94iKzBGdzGphdrzzM1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000BTWDfYZVR30007108056cVB94iKzBGxG3CcoXDlM1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670008238976cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000CEENawQ48p0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010009696cVB94iKzBGPvFe4O6Jgt1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0010011456cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0010011456cVB94iKzBGDiTafU5Ef11B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008238976cVB94iKzBGbD0ndTlh3z1B2M2Y8Asg0009RkAhURpFP00000hn5Xv000006QM8y8OMxH8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0010009696cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000BTWDfYZVR30032254872cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008238976cVB94iKzBGPvFe4O6Jgt1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008238976cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008238976cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000duBbAmf7Y700000hn5Xv00000GSz4UPaO7H8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBGyE1g46dVeD1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005L7iGrdXwD0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008236800cVB94iKzBGFtJ250WGd31B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0010009696cVB94iKzBGXcpoEuvoS21B2M2Y8Asg0009RkAhURpFP00000hn5Xv000006QM8y8OMxH8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000BdX2oztV6T8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', 's45DnDC1mc0040000000000000LOziC3ZM670050271576cVB94iKzBGzk6emGsPvHswEtLkIt16002PIQPoOokfj00000qZkTE000000KmuVkQwkG8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008577768cVB94iKzBG6fNkR7hpDE1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670089146776cVB94iKzBG1gDdds634R1B2M2Y8Asg000RvhkW58GG500000YVxErxMpCOFXcvDVVNDi8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008238976cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000Er39RblXKg00000hn5Xv00000KXDjDIKhGz8bcIu6FDHO:20', 'ryEGX8eZpJ00300000000000005B8Gc9qXKS0025537800cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGBcniYCrDOp1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBGDiTafU5Ef11B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000BcYjP5Kj2S8bcIu6FDHO:20', '36cMbcuFZD0030000000000000pgIOdGFwF00050271576cVB94iKzBG5fBQBEyytB5S16Goh5Mk00464HD5GXZ7Y00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0053494770cVB94iKzBGLjsH1QZZVo5S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0089243136cVB94iKzBGzk6emGsPvH5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', 'q7ybAfUCXE0010000000000000bsx09CX6tD0031498296cVB94iKzBGSFO6CxiVC0kfFkZiNCJG0039euVDsmJuG00000YVxEr00000jUVtiFCq5Z8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0009040344cVB94iKzBGAmaG6DGRlM1B2M2Y8Asg000yQbjCcwOgK00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000CEENawQ48p0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0008577768cVB94iKzBGWhEz3CiFT21B2M2Y8Asg000DUVZiy1x2U00000vwT38xMpCOTQHV0mScHm8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0010011456cVB94iKzBGPvFe4O6Jgt1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0050271576cVB94iKzBG7zBLgDTsSu5S16Goh5Mk0045zgp4q8JSa00000qZkTE00000PRbZ1HbvOQ8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000BTWDfYZVR30010011456cVB94iKzBGCIrjsrDTmG1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30007824000cVB94iKzBG5Y8lDq5X5T1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0012165216cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000CEENawQ48p0012165216cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0012165216cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010011456cVB94iKzBGt5t5NLXhjb1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010011456cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000KZbIQj6kzs0008238976cVB94iKzBGTP1vEvWuYe1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010011456cVB94iKzBGDiTafU5Ef11B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0007910400cVB94iKzBGN4bbjfNC5o1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670012165216cVB94iKzBGyE1g46dVeD1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000BTWDfYZVR30008809056cVB94iKzBGMxRDPpSLFM1B2M2Y8Asg000GhW9lhDGPr00000vwT3800000jf1zKDHFWq8bcIu6FDHO:40', 'ryEGX8eZpJ00300000000000005L7iGrdXwD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg00000000000000005B8Gc9qXKS0008448000cVB94iKzBGro5iFIEcdQ1B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0010009696cVB94iKzBGt5t5NLXhjb1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0010011456cVB94iKzBGd90t3uUgjM1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LOziC3ZM670010009696cVB94iKzBGQJCw2Paaou1B2M2Y8Asg000Er39RblXKg00000hn5Xv00000PRlpbD8Nw38bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0026594568cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670007431384cVB94iKzBGmazXflUXli1B2M2Y8Asg000wJbVpEDXUH00000vwT3800000WWM8ZRqPdS8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670119707416cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000BTWDfYZVR30012165216cVB94iKzBGBcniYCrDOp1B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000LlDyZ49njD0012165216cVB94iKzBGCIrjsrDTmG1B2M2Y8Asg000daLvDDB8VY00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000bsx09CX6tD0031845528cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000LOziC3ZM670008577768cVB94iKzBGY0DfmW5Fdi1B2M2Y8Asg000DUVZiy1x2U00000vwT3800000TQHV0mScHm8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0053494770cVB94iKzBGoWdpudhStG5S16Goh5Mk004ivbSuYdG0R00000YVxEr00000cru9sAxTR58bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000xZXdueIoxW0009176856cVB94iKzBGg7WPGIHQU31B2M2Y8Asg000zZEFixwdNc00000vwT3800000FGeD0nPnYH8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000KZbIQj6kzs0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004SRE3NcgP6100000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LOziC3ZM670030327000cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0025537800cVB94iKzBGzk6emGsPvH5S16Goh5Mk004mvcujCW8QL00000qZkTE00000VbreruJ83I8bcIu6FDHO:40', 'ryEGX8eZpJ0030000000000000LlDyZ49njD0050271576cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000CEENawQ48p0008238976cVB94iKzBG0CtMHDnEu31B2M2Y8Asg000SiFz5prGoR00000hn5Xv00000VUKxFcDjif8bcIu6FDHO:20', 'ryEGX8eZpJ0030000000000000KZbIQj6kzs0089146776cVB94iKzBGzk6emGsPvH5S16Goh5Mk004IGYNCsj6yI00000qZkTE00000D0TcU6kNiL8bcIu6FDHO:40', '1B2M2Y8Asg0000000000000000bsx09CX6tD0012165216cVB94iKzBGYT20de2be21B2M2Y8Asg000YZXcXIyJS700000hn5Xv00000BcYjP5Kj2S8bcIu6FDHO:20', '1B2M2Y8Asg0000000000000000zD6kLsGI2i0010011456cVB94iKzBG2UjOeLuZdO1B2M2Y8Asg0006AcncXOpKB00000hn5Xv00000UhiWo2YDS38bcIu6FDHO:20' ]; export const getDfValue = () => randomItem(values); ================================================ FILE: app/tasks/footsites/utils/forms.ts ================================================ import uuid from 'uuid'; export const customerInfoEU = ( shipping: any, billing: any, payerId = uuid(), nonce = uuid() ) => { const { name: sName, address: sAddress, apt: sApt, city: sCity, zip: sZip, country: { value: sCountry } } = shipping; const { name: bName, email, address: bAddress, apt: bApt, city: bCity, zip: bZip, phone, country: { value: bCountry } } = billing; const holderParts = bName.split(' '); const [bFirstName] = holderParts; const bLastName = holderParts[holderParts.length - 1]; const checkoutType = 'CREDIT_CARD'; const type = 'CreditCard'; return { checkoutType, nonce, details: { email, firstName: bFirstName, lastName: bLastName, payerId, shippingAddress: { recipientName: sName, line1: sAddress, line2: sApt, extendedAddress: sApt, streetAddress: sApt, city: sCity, postalCode: sZip, countryCode: sCountry, countryCodeAlpha2: sCountry, locality: sCity }, phone, countryCode: sCountry, billingAddress: { recipientName: bName, line1: bAddress, line2: bApt, extendedAddress: bApt, streetAddress: bApt, city: bCity, postalCode: bZip, countryCode: bCountry, countryCodeAlpha2: bCountry, locality: bCity } }, type }; }; export const customerInfo = ( shipping: any, billing: any, payerId = uuid(), nonce = uuid() ) => { const { name: sName, address: sAddress, apt: sApt, city: sCity, province: sProvince, zip: sZip, country: { value: sCountry } } = shipping; const { name: bName, email, address: bAddress, apt: bApt, city: bCity, province: bProvince, zip: bZip, phone, country: { value: bCountry } } = billing; const holderParts = bName.split(' '); const [bFirstName] = holderParts; const bLastName = holderParts[holderParts.length - 1]; const checkoutType = 'CREDIT_CARD'; const type = 'CreditCard'; return { checkoutType, nonce, details: { email, firstName: bFirstName, lastName: bLastName, payerId, shippingAddress: { recipientName: sName, line1: sAddress, line2: sApt, extendedAddress: sApt, streetAddress: sApt, city: sCity, state: sProvince?.value || '', postalCode: sZip, countryCode: sCountry, countryCodeAlpha2: sCountry, locality: sCity, region: sProvince?.value || '' }, phone, countryCode: sCountry, billingAddress: { recipientName: bName, line1: bAddress, line2: bApt, extendedAddress: bApt, streetAddress: bApt, city: bCity, state: bProvince?.value || '', postalCode: bZip, countryCode: bCountry, countryCodeAlpha2: bCountry, locality: bCity, region: bProvince?.value || '' } }, type }; }; export const shippingInfoEU = (shipping: any) => { const { name, address, apt, phone, city, zip, country, province } = shipping; const shippingName = name.split(' '); const [firstName] = shippingName; const lastName = shippingName[shippingName.length - 1]; const base: any = { shippingAddress: { setAsDefaultBilling: false, setAsDefaultShipping: false, firstName, lastName, email: false, phone, country: { isocode: country.value, name: country.label }, id: null, setAsBilling: true, saveInAddressBook: false, type: 'default', LoqateSearch: '', town: city, line1: address, line2: apt, postalCode: zip, shippingAddress: true } }; if (province) { base.shippingAddress.region = { countryIso: country.value, isocode: `${country.value}-${province.value}`, isocodeShort: province.value, name: province.label }; } return base; }; export const shippingInfo = (shipping: any) => { const { name, address, apt, phone, city, zip, country, province } = shipping; const shippingName = name.split(' '); const [firstName] = shippingName; const lastName = shippingName[shippingName.length - 1]; const base: any = { shippingAddress: { line1: address, phone, firstName, country: { isocode: country.value, name: country.label }, isFPO: false, line2: apt, town: city, postalCode: zip, lastName } }; if (province) { base.shippingAddress.region = { countryIso: country.value, isocode: `${country.value}-${province.value}`, isocodeShort: province.value, name: province.label }; } return base; }; export const billingInfoEU = (billing: any) => { const { name, address, apt, phone, city, zip, country } = billing; const billingName = name.split(' '); const [firstName] = billingName; const lastName = billingName[billingName.length - 1]; return { setAsDefaultBilling: false, setAsDefaultShipping: false, firstName, lastName, email: false, phone, country: { isocode: country.value, name: country.label }, id: null, setAsBilling: false, saveInAddressBook: false, type: 'default', LoqateSearch: '', town: city, line1: address, line2: apt, postalCode: zip, shippingAddress: true }; }; export const billingInfo = (billing: any) => { const { name, address, apt, phone, city, zip, country, province } = billing; const billingName = name.split(' '); const [firstName] = billingName; const lastName = billingName[billingName.length - 1]; const base: any = { setAsDefaultBilling: false, setAsDefaultShipping: false, postalCode: zip, email: false, line2: apt, shippingAddress: true, firstName, defaultAddress: false, id: null, billingAddress: false, line1: address, lastName, phone, visibleInAddressBook: false, isFPO: false, formattedAddress: `${address}, ${apt}, ${city}, ${zip}`, setAsBilling: false, town: city, country: { isocode: country.value, name: country.label } }; if (province) { base.formattedAddress = `${address}, ${apt}, ${province.value}, ${city}, ${zip}`; base.region = { countryIso: country.value, isocode: `${country.value}-${province.value}`, isocodeShort: province.value, name: province.label }; } return base; }; ================================================ FILE: app/tasks/footsites/utils/index.ts ================================================ import { userAgent } from '../../common/utils'; import { cleanseHeaderData } from './cleanseHeaderData'; import { getDfValue } from './dfValues'; export const getHeaders = (url: string) => ({ accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-language': 'en-US,en;q=0.9', 'cache-control': 'max-age=0', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'none', origin: url, referer: url, 'user-agent': userAgent, connection: 'close' }); export const getHostname = (url: string) => new URL(url).hostname; export const toRandomCase = (string: string) => string .split('') .map(c => (Math.random() > 0.5 ? c.toUpperCase() : c)) .join(''); export const domainForUrl = (url: string) => { if (/footlocker/i.test(url)) { if (/ca/i.test(url)) { return '.footlocker.ca'; } return '.footlocker.com'; } if (/footaction/i.test(url)) { return '.footaction.com'; } if (/champs/i.test(url)) { return '.champssports.com'; } if (/eastbay/i.test(url)) { return '.eastbay.com'; } return '.footlocker.com'; }; export const getSiteIdentifier = (url: string) => { if (/footlocker/i.test(url)) { if (/ca/i.test(url)) { return 'FLCA'; } return 'FL'; } if (/footaction/i.test(url)) { return 'FA'; } if (/champs/i.test(url)) { return 'CS'; } if (/eastbay/i.test(url)) { return 'EB'; } return 'FL'; }; const subnetRanges = [ '66.94.4.', '66.94.3.', '66.94.14.', '66.94.30.', '66.94.1.', '66.94.4.', '66.94.2.', '66.94.0.', '66.94.3.', '66.94.6.', '66.94.5.', '66.94.7.', '66.94.8.', '66.94.9.', '66.94.10.', '66.94.11.', '66.94.12.', '66.94.13.', '66.94.15.', '66.94.16.', '66.94.14.', '66.94.17.', '66.94.18.', '66.94.19.', '66.94.21.', '66.94.20.', '66.94.22.', '66.94.23.', '66.94.24.', '66.94.26.', '66.94.25.', '66.94.27.', '66.94.28.', '66.94.29.', '66.94.30.', '66.94.31.', '68.24.82.', '72.250.1.', '72.250.3.', '72.250.2.', '72.250.0.', '72.250.5.', '72.250.4.', '72.250.7.', '72.250.6.', '72.250.8.', '72.250.10.', '72.250.11.', '72.250.9.', '72.250.13.', '72.250.12.', '72.250.15.', '72.250.14.', '72.250.16.', '72.250.17.', '72.250.19.', '72.250.18.', '72.250.20.', '72.250.21.', '72.250.22.', '72.250.23.', '72.250.24.', '72.250.27.', '72.250.25.', '72.250.26.', '72.250.28.', '72.250.29.', '72.250.31.', '72.250.30.', '72.250.33.', '72.250.32.', '72.250.34.', '72.250.37.', '72.250.36.', '72.250.35.', '72.250.38.', '72.250.39.', '72.250.40.', '72.250.42.', '72.250.41.', '72.250.43.', '72.250.44.', '72.250.46.', '72.250.48.', '72.250.47.', '72.250.45.', '72.250.50.', '72.250.51.', '72.250.49.', '72.250.52.', '72.250.56.', '72.250.54.', '72.250.53.', '72.250.55.', '72.250.58.', '72.250.59.', '72.250.57.', '72.250.60.', '72.250.61.', '72.250.62.', '72.250.64.', '72.250.63.', '72.250.65.', '72.250.66.', '72.250.68.', '72.250.67.', '72.250.70.', '72.250.69.', '72.250.71.', '72.250.73.', '72.250.72.', '72.250.74.', '72.250.75.', '72.250.76.', '72.250.77.', '72.250.78.', '72.250.79.', '72.250.81.', '72.250.80.', '72.250.82.', '72.250.83.', '72.250.84.', '72.250.85.', '72.250.86.', '72.250.87.', '72.250.88.', '72.250.89.', '72.250.90.', '72.250.91.', '72.250.92.', '72.250.93.', '72.250.94.', '72.250.95.', '72.250.96.', '72.250.97.', '72.250.98.', '72.250.99.', '72.250.100.', '72.250.102.', '72.250.101.', '72.250.103.', '72.250.104.', '72.250.105.', '72.250.107.', '72.250.106.', '72.250.108.', '72.250.109.', '72.250.110.', '72.250.112.', '72.250.111.', '72.250.113.', '72.250.114.', '72.250.115.', '72.250.116.', '72.250.118.', '72.250.117.', '72.250.119.', '72.250.120.', '72.250.121.', '72.250.122.', '72.250.123.', '72.250.124.', '72.250.125.', '72.250.126.', '72.250.127.', '66.94.17.', '66.94.15.', '172.32.1.', '172.32.0.', '172.32.2.', '172.32.3.', '172.32.4.', '172.32.5.', '172.32.6.', '172.32.7.', '172.32.8.', '172.32.9.', '172.32.10.', '172.32.11.', '172.32.12.', '172.32.13.', '172.32.14.', '172.32.15.', '172.32.16.', '172.32.17.', '172.32.18.', '172.32.19.', '172.32.20.', '172.32.21.', '172.32.22.', '172.32.23.', '172.32.25.', '172.32.24.', '172.32.27.', '172.32.26.', '172.32.29.', '172.32.28.', '172.32.30.', '172.32.31.', '172.32.33.', '172.32.32.', '172.32.35.', '172.32.34.', '172.32.36.', '172.32.37.', '172.32.38.', '172.32.40.', '172.32.39.', '172.32.41.', '172.32.42.', '172.32.43.', '172.32.45.', '172.32.44.', '172.32.46.', '172.32.47.', '172.32.49.', '172.32.48.', '172.32.51.', '172.32.50.', '172.32.52.', '172.32.53.', '172.32.54.', '172.32.55.', '172.32.56.', '172.32.57.', '172.32.58.', '172.32.60.', '172.32.61.', '172.32.59.', '172.32.62.', '172.32.63.', '172.32.64.', '172.32.65.', '172.32.66.', '172.32.67.', '172.32.68.', '172.32.69.', '172.32.70.', '172.32.72.', '172.32.71.', '172.32.73.', '172.32.74.', '172.32.75.', '172.32.76.', '172.32.77.', '172.32.78.', '172.32.79.', '172.32.81.', '172.32.80.', '172.32.82.', '172.32.83.', '172.32.84.', '172.32.85.', '172.32.86.', '172.32.87.', '172.32.88.', '172.32.89.', '172.32.90.', '172.32.91.', '172.32.92.', '172.32.93.', '172.32.94.', '172.32.95.', '172.32.96.', '172.32.97.', '172.32.99.', '172.32.98.', '172.32.100.', '172.32.101.', '172.32.103.', '172.32.102.', '172.32.105.', '172.32.104.', '172.32.106.', '172.32.107.', '172.32.108.', '172.32.109.', '172.32.111.', '172.32.112.', '172.32.110.', '172.32.113.', '172.32.114.', '172.32.115.', '172.32.116.', '172.32.117.', '172.32.118.', '172.32.119.', '172.32.120.', '172.32.121.', '172.32.122.', '172.32.123.', '172.32.124.', '172.32.125.', '172.32.126.', '172.32.127.', '172.32.128.', '172.32.129.', '172.32.130.', '172.32.132.', '172.32.131.', '172.32.133.', '172.32.134.', '172.32.135.', '172.32.137.', '172.32.136.', '172.32.138.', '172.32.139.', '172.32.140.', '172.32.142.', '172.32.141.', '172.32.143.', '172.32.144.', '172.32.145.', '172.32.146.', '172.32.147.', '172.32.148.', '172.32.149.', '172.32.150.', '172.32.151.', '172.32.152.', '172.32.153.', '172.32.154.', '172.32.155.', '172.32.156.', '172.32.157.', '172.32.158.', '172.32.159.', '172.32.161.', '172.32.160.', '172.32.162.', '172.32.163.', '172.32.164.', '172.32.165.', '172.32.166.', '172.32.167.', '172.32.169.', '172.32.168.', '172.32.171.', '172.32.170.', '172.32.173.', '172.32.172.', '172.32.174.', '172.32.175.', '172.32.176.', '172.32.177.', '172.32.178.', '172.32.179.', '172.32.181.', '172.32.182.', '172.32.180.', '172.32.183.', '172.32.184.', '172.32.185.', '172.32.186.', '172.32.187.', '172.32.188.', '172.32.189.', '172.32.190.', '172.32.191.', '172.32.192.', '172.32.193.', '172.32.194.', '172.32.195.', '172.32.196.', '172.32.197.', '172.32.198.', '172.32.199.', '172.32.200.', '172.32.202.', '172.32.201.', '172.32.203.', '172.32.204.', '172.32.205.', '172.32.206.', '172.32.207.', '172.32.208.', '172.32.209.', '172.32.210.', '172.32.211.', '172.32.212.', '172.32.213.', '172.32.214.', '172.32.215.', '172.32.216.', '172.32.217.', '172.32.218.', '172.32.219.', '172.32.220.', '172.32.221.', '172.32.222.', '172.32.223.', '172.32.224.', '172.32.225.', '172.32.226.', '172.32.227.', '172.32.228.', '172.32.229.', '172.32.230.', '172.32.232.', '172.32.231.', '172.32.233.', '172.32.234.', '172.32.235.', '172.32.236.', '172.32.237.', '172.32.238.', '172.32.239.', '172.32.241.', '172.32.240.', '172.32.243.', '172.32.242.', '172.32.244.', '172.32.245.', '172.32.246.', '172.32.247.', '172.32.248.', '172.32.249.', '172.32.251.', '172.32.250.', '172.32.252.', '172.32.253.', '172.32.255.', '172.32.254.', '162.160.1.', '162.160.0.', '162.160.2.', '162.160.3.', '162.160.4.', '162.160.5.', '162.160.6.', '162.160.7.', '162.160.8.', '162.160.9.', '162.160.11.', '162.160.10.', '162.160.12.', '162.160.13.', '162.160.14.', '162.160.15.', '162.160.16.', '162.160.17.', '162.160.18.', '162.160.19.', '162.160.20.', '162.160.21.', '162.160.23.', '162.160.22.', '162.160.24.', '162.160.25.', '162.160.26.', '162.160.27.', '162.160.28.', '162.160.29.', '162.160.30.', '162.160.32.', '162.160.31.', '162.160.34.', '162.160.35.', '162.160.33.', '162.160.36.', '162.160.37.', '162.160.38.', '162.160.41.', '162.160.39.', '162.160.40.', '162.160.43.', '162.160.44.', '162.160.42.', '162.160.45.', '162.160.47.', '162.160.46.', '162.160.48.', '162.160.49.', '162.160.50.', '162.160.51.', '162.160.53.', '162.160.52.', '162.160.54.', '162.160.55.', '162.160.56.', '162.160.57.', '162.160.58.', '162.160.59.', '162.160.60.', '162.160.61.', '162.160.62.', '162.160.63.', '162.160.64.', '162.160.65.', '162.160.66.', '162.160.67.', '162.160.68.', '162.160.69.', '162.160.70.', '162.160.71.', '162.160.72.', '162.160.73.', '162.160.74.', '162.160.75.', '162.160.76.', '162.160.77.', '162.160.78.', '162.160.79.', '162.160.80.', '162.160.81.', '162.160.82.', '162.160.83.', '162.160.84.', '162.160.85.', '162.160.86.', '162.160.87.', '162.160.88.', '162.160.89.', '162.160.90.', '162.160.91.', '162.160.92.', '162.160.93.', '162.160.94.', '162.160.95.', '162.160.96.', '162.160.97.', '162.160.98.', '162.160.99.', '162.160.100.', '162.160.101.', '162.160.102.', '162.160.103.', '162.160.104.', '162.160.105.', '162.160.106.', '162.160.107.', '162.160.108.', '162.160.110.', '162.160.109.', '162.160.111.', '162.160.112.', '162.160.113.', '162.160.114.', '162.160.115.', '162.160.116.', '162.160.117.', '162.160.118.', '162.160.119.', '162.160.120.', '162.160.121.', '162.160.122.', '162.160.124.', '162.160.123.', '162.160.125.', '162.160.126.', '162.160.127.', '162.160.128.', '162.160.129.', '162.160.130.', '162.160.131.', '162.160.132.', '162.160.133.', '162.160.134.', '162.160.135.', '162.160.136.', '162.160.137.', '162.160.138.', '162.160.139.', '162.160.140.', '162.160.142.', '162.160.141.', '162.160.144.', '162.160.143.', '162.160.145.', '162.160.146.', '162.160.147.', '162.160.148.', '162.160.150.', '162.160.149.', '162.160.151.', '162.160.152.', '162.160.154.', '162.160.153.', '162.160.156.', '162.160.155.', '162.160.158.', '162.160.157.', '162.160.159.', '162.160.160.', '162.160.162.', '162.160.161.', '162.160.164.', '162.160.163.', '162.160.165.', '162.160.166.', '162.160.169.', '162.160.167.', '162.160.168.', '162.160.170.', '162.160.171.', '162.160.172.', '162.160.173.', '162.160.174.', '162.160.175.', '162.160.176.', '162.160.178.', '162.160.177.', '162.160.180.', '162.160.179.', '162.160.181.', '162.160.182.', '162.160.183.', '162.160.185.', '162.160.184.', '162.160.187.', '162.160.186.', '162.160.188.', '162.160.189.', '162.160.190.', '162.160.192.', '162.160.191.', '162.160.194.', '162.160.196.', '162.160.195.', '162.160.193.', '162.160.197.', '162.160.198.', '162.160.199.', '162.160.200.', '162.160.201.', '162.160.202.', '162.160.203.', '162.160.204.', '162.160.205.', '162.160.206.', '162.160.207.', '162.160.208.', '162.160.209.', '162.160.210.', '162.160.211.', '162.160.213.', '162.160.212.', '162.160.214.', '162.160.215.', '162.160.216.', '162.160.217.', '162.160.218.', '162.160.220.', '162.160.219.', '162.160.221.', '162.160.222.', '162.160.223.', '162.160.224.', '162.160.226.', '162.160.225.', '162.160.227.', '162.160.228.', '162.160.229.', '162.160.230.', '162.160.231.', '162.160.232.', '162.160.233.', '162.160.234.', '162.160.235.', '162.160.236.', '162.160.237.', '162.160.239.', '162.160.238.', '162.160.240.', '162.160.241.', '162.160.242.', '162.160.243.', '162.160.244.', '162.160.245.', '162.160.246.', '162.160.247.', '162.160.248.', '162.160.249.', '162.160.250.', '162.160.251.', '162.160.252.', '162.160.253.', '162.160.254.', '66.94.7.', '162.160.255.', '66.94.18.', '66.94.19.', '66.94.13.', '162.191.0.', '162.191.1.', '162.191.3.', '162.191.2.', '162.191.4.', '162.191.5.', '162.191.6.', '162.191.8.', '162.191.7.', '162.191.9.', '162.191.10.', '162.191.13.', '162.191.11.', '162.191.12.', '162.191.14.', '162.191.15.', '162.191.16.', '162.191.17.', '162.191.18.', '162.191.19.', '162.191.20.', '162.191.21.', '162.191.22.', '162.191.24.', '162.191.23.', '162.191.25.', '162.191.26.', '162.191.27.', '162.191.28.', '162.191.29.', '162.191.30.', '162.191.31.', '162.191.32.', '162.191.33.', '162.191.34.', '162.191.35.', '162.191.36.', '162.191.37.', '162.191.38.', '162.191.39.', '162.191.40.', '162.191.41.', '162.191.42.', '162.191.44.', '162.191.43.', '162.191.45.', '162.191.46.', '162.191.47.', '162.191.48.', '162.191.49.', '162.191.50.', '162.191.51.', '162.191.52.', '162.191.53.', '162.191.54.', '162.191.55.', '162.191.57.', '162.191.56.', '162.191.58.', '162.191.59.', '162.191.60.', '162.191.61.', '162.191.62.', '162.191.63.', '162.191.65.', '162.191.64.', '162.191.66.', '162.191.67.', '162.191.68.', '162.191.69.', '162.191.70.', '162.191.72.', '162.191.71.', '162.191.73.', '162.191.74.', '162.191.75.', '162.191.76.', '162.191.77.', '162.191.78.', '162.191.79.', '162.191.80.', '162.191.81.', '162.191.82.', '162.191.83.', '162.191.84.', '162.191.85.', '162.191.86.', '162.191.87.', '162.191.88.', '162.191.90.', '162.191.89.', '162.191.91.', '162.191.92.', '162.191.93.', '162.191.94.', '162.191.95.', '162.191.97.', '162.191.96.', '162.191.98.', '162.191.99.', '162.191.101.', '162.191.102.', '162.191.103.', '162.191.100.', '162.191.104.', '162.191.105.', '162.191.106.', '162.191.107.', '162.191.108.', '162.191.109.', '162.191.110.', '162.191.111.', '162.191.112.', '162.191.113.', '162.191.114.', '162.191.115.', '162.191.117.', '162.191.116.', '162.191.118.', '162.191.120.', '162.191.121.', '162.191.123.', '162.191.119.', '162.191.124.', '162.191.122.', '162.191.125.', '162.191.126.', '162.191.127.', '162.191.128.', '162.191.130.', '162.191.129.', '162.191.132.', '162.191.131.', '162.191.134.', '162.191.133.', '162.191.136.', '162.191.135.', '162.191.137.', '162.191.138.', '162.191.139.', '162.191.140.', '162.191.142.', '162.191.141.', '162.191.143.', '162.191.144.', '162.191.145.', '162.191.146.', '162.191.148.', '162.191.149.', '162.191.150.', '162.191.147.', '162.191.151.', '162.191.152.', '162.191.153.', '162.191.155.', '162.191.154.', '162.191.156.', '162.191.157.', '162.191.159.', '162.191.158.', '162.191.160.', '162.191.161.', '162.191.162.', '162.191.163.', '162.191.164.', '162.191.165.', '162.191.166.', '162.191.167.', '162.191.168.', '162.191.169.', '162.191.170.', '162.191.171.', '162.191.172.', '162.191.173.', '162.191.174.', '162.191.177.', '162.191.175.', '162.191.176.', '162.191.178.', '162.191.180.', '162.191.179.', '162.191.181.', '162.191.182.', '162.191.183.', '162.191.184.', '162.191.185.', '162.191.186.', '162.191.187.', '162.191.188.', '162.191.189.', '162.191.191.', '162.191.190.', '162.191.193.', '162.191.194.', '162.191.192.', '162.191.195.', '162.191.196.', '162.191.198.', '162.191.197.', '162.191.199.', '162.191.200.', '162.191.201.', '162.191.202.', '162.191.203.', '162.191.204.', '162.191.205.', '162.191.206.', '162.191.207.', '162.191.208.', '162.191.209.', '162.191.210.', '162.191.211.', '162.191.212.', '162.191.213.', '162.191.214.', '162.191.216.', '162.191.215.', '162.191.217.', '162.191.218.', '162.191.219.', '162.191.220.', '162.191.221.', '162.191.222.', '162.191.223.', '162.191.225.', '162.191.224.', '162.191.226.', '162.191.227.', '162.191.228.', '162.191.229.', '162.191.230.', '162.191.231.', '162.191.232.', '162.191.233.', '162.191.234.', '162.191.235.', '162.191.236.', '162.191.237.', '162.191.238.', '162.191.240.', '162.191.239.', '162.191.241.', '162.191.242.', '162.191.243.', '162.191.244.', '162.191.245.', '162.191.247.', '162.191.246.', '162.191.248.', '162.191.249.', '162.191.250.', '162.191.251.', '162.191.252.', '162.191.254.', '162.191.255.', '162.191.253.', '66.94.5.', '172.56.15.', '172.56.14.', '162.186.1.', '66.94.29.', '162.186.0.', '162.186.3.', '162.186.4.', '162.186.2.', '162.186.5.', '162.186.7.', '162.186.6.', '162.186.9.', '162.186.8.', '162.186.11.', '162.186.10.', '162.186.12.', '162.186.13.', '162.186.15.', '162.186.14.', '162.186.17.', '162.186.16.', '162.186.18.', '162.186.19.', '162.186.20.', '162.186.21.', '162.186.23.', '162.186.22.', '162.186.24.', '162.186.25.', '162.186.26.', '162.186.29.', '162.186.28.', '162.186.31.', '162.186.27.', '162.186.30.', '162.186.32.', '162.186.33.', '162.186.35.', '162.186.34.', '162.186.36.', '162.186.37.', '162.186.38.', '162.186.39.', '162.186.41.', '162.186.40.', '162.186.42.', '162.186.43.', '162.186.44.', '162.186.45.', '162.186.46.', '162.186.47.', '162.186.49.', '162.186.48.', '162.186.50.', '162.186.51.', '162.186.52.', '162.186.53.', '162.186.55.', '162.186.54.', '162.186.56.', '162.186.57.', '162.186.58.', '162.186.59.', '162.186.60.', '162.186.61.', '162.186.63.', '162.186.62.', '162.186.65.', '162.186.64.', '162.186.66.', '162.186.67.', '162.186.68.', '162.186.69.', '162.186.70.', '162.186.71.', '162.186.72.', '162.186.73.', '162.186.74.', '162.186.75.', '162.186.76.', '162.186.77.', '162.186.78.', '162.186.79.', '162.186.80.', '162.186.81.', '162.186.82.', '162.186.83.', '162.186.84.', '162.186.85.', '162.186.86.', '162.186.87.', '162.186.88.', '162.186.89.', '162.186.90.', '162.186.91.', '162.186.92.', '162.186.93.', '162.186.94.', '162.186.95.', '162.186.96.', '162.186.97.', '162.186.98.', '162.186.99.', '162.186.100.', '162.186.101.', '162.186.102.', '162.186.103.', '162.186.105.', '162.186.104.', '162.186.106.', '162.186.107.', '162.186.108.', '162.186.109.', '162.186.111.', '162.186.110.', '162.186.112.', '162.186.113.', '162.186.114.', '162.186.116.', '162.186.115.', '162.186.117.', '162.186.119.', '162.186.118.', '162.186.120.', '162.186.121.', '162.186.122.', '162.186.124.', '162.186.123.', '162.186.125.', '162.186.126.', '162.186.127.', '162.186.128.', '162.186.129.', '162.186.130.', '162.186.131.', '162.186.132.', '162.186.133.', '162.186.134.', '162.186.135.', '162.186.136.', '162.186.137.', '162.186.138.', '162.186.139.', '162.186.140.', '162.186.141.', '162.186.142.', '162.186.143.', '162.186.144.', '162.186.145.', '162.186.147.', '162.186.146.', '162.186.148.', '162.186.150.', '162.186.149.', '162.186.151.', '162.186.152.', '162.186.153.', '162.186.155.', '162.186.154.', '162.186.156.', '162.186.158.', '162.186.157.', '162.186.159.', '162.186.160.', '162.186.161.', '162.186.163.', '162.186.162.', '162.186.164.', '162.186.165.', '162.186.167.', '162.186.166.', '162.186.168.', '162.186.169.', '162.186.170.', '162.186.171.', '162.186.172.', '162.186.173.', '162.186.174.', '162.186.175.', '162.186.176.', '162.186.177.', '162.186.178.', '162.186.180.', '162.186.179.', '162.186.182.', '162.186.183.', '162.186.181.', '162.186.184.', '162.186.186.', '162.186.185.', '162.186.187.', '162.186.188.', '162.186.189.', '162.186.190.', '162.186.192.', '162.186.191.', '162.186.194.', '162.186.193.', '162.186.195.', '162.186.196.', '162.186.197.', '162.186.198.', '162.186.199.', '162.186.200.', '162.186.201.', '162.186.202.', '162.186.203.', '162.186.204.', '162.186.205.', '162.186.206.', '162.186.207.', '162.186.208.', '162.186.209.', '162.186.212.', '162.186.210.', '162.186.211.', '162.186.213.', '162.186.215.', '162.186.214.', '162.186.216.', '162.186.217.', '162.186.218.', '162.186.220.', '162.186.221.', '162.186.219.', '162.186.222.', '162.186.223.', '162.186.224.', '162.186.225.', '162.186.226.', '162.186.227.', '162.186.228.', '162.186.229.', '162.186.230.', '162.186.232.', '162.186.231.', '162.186.233.', '162.186.234.', '162.186.235.', '162.186.236.', '162.186.237.', '162.186.238.', '162.186.239.', '162.186.240.', '162.186.241.', '162.186.242.', '162.186.243.', '162.186.244.', '162.186.245.', '162.186.247.', '162.186.246.', '162.186.248.', '162.186.249.', '162.186.250.', '162.186.251.', '162.186.252.', '162.186.253.', '162.186.255.', '162.186.254.', '172.56.22.', '172.56.2.', '172.56.23.', '172.56.3.', '172.58.88.', '172.58.89.', '172.58.90.', '172.58.91.', '172.58.92.', '172.58.94.', '172.58.95.', '172.56.10.', '172.58.93.', '172.56.11.', '172.56.143.', '172.56.37.', '172.56.36.', '208.54.80.', '172.58.104.', '172.58.106.', '172.58.107.', '172.58.105.', '172.58.109.', '172.58.110.', '172.58.108.', '172.58.111.', '172.58.96.', '172.58.98.', '172.58.99.', '172.58.97.', '172.58.100.', '172.58.102.', '172.58.101.', '172.58.103.', '172.58.17.', '172.58.16.', '172.58.18.', '172.58.19.', '172.58.20.', '172.58.21.', '172.58.23.', '172.58.22.', '208.54.44.', '172.58.83.', '172.58.80.', '172.58.81.', '172.58.82.', '172.58.84.', '172.58.85.', '172.58.86.', '172.58.87.', '208.54.76.', '208.54.77.', '208.54.79.', '208.54.78.', '208.54.70.', '208.54.5.', '208.54.66.', '172.58.57.', '172.58.56.', '172.58.58.', '172.58.59.', '172.58.60.', '172.58.61.', '172.58.63.', '172.58.62.', '172.58.144.', '172.58.145.', '172.58.146.', '172.58.147.', '172.58.148.', '172.58.149.', '172.58.150.', '172.58.151.', '172.58.186.', '172.58.184.', '172.58.185.', '172.58.187.', '172.58.188.', '172.58.189.', '172.58.191.', '172.58.190.', '172.58.8.', '172.58.9.', '172.58.11.', '172.58.10.', '172.58.12.', '172.58.13.', '172.58.15.', '172.58.14.', '172.58.120.', '172.58.123.', '172.58.122.', '172.58.121.', '172.58.124.', '172.58.125.', '172.58.126.', '172.58.127.', '172.58.0.', '172.58.1.', '172.58.3.', '172.58.2.', '172.58.5.', '172.58.4.', '172.58.7.', '172.58.6.', '172.58.9.', '172.58.8.', '172.58.10.', '172.58.11.', '172.58.12.', '172.58.14.', '172.58.13.', '172.58.16.', '172.58.15.', '172.58.18.', '172.58.17.', '172.58.20.', '172.58.19.', '172.58.22.', '172.58.21.', '172.58.24.', '172.58.23.', '172.58.25.', '172.58.26.', '172.58.27.', '172.58.29.', '172.58.30.', '172.58.28.', '172.58.31.', '172.58.33.', '172.58.34.', '172.58.32.', '172.58.35.', '172.58.36.', '172.58.37.', '172.58.38.', '172.58.39.', '172.58.40.', '172.58.42.', '172.58.43.', '172.58.41.', '172.58.44.', '172.58.45.', '172.58.46.', '172.58.47.', '172.58.48.', '172.58.49.', '172.58.50.', '172.58.51.', '172.58.52.', '172.58.53.', '172.58.54.', '172.58.55.', '172.58.56.', '172.58.57.', '172.58.58.', '172.58.59.', '172.58.60.', '172.58.61.', '172.58.63.', '172.58.62.', '172.58.64.', '172.58.65.', '172.58.66.', '172.58.67.', '172.58.68.', '172.58.69.', '172.58.70.', '172.58.71.', '172.58.72.', '172.58.73.', '172.58.74.', '172.58.75.', '172.58.76.', '172.58.77.', '172.58.79.', '172.58.78.', '172.58.80.', '172.58.81.', '172.58.82.', '172.58.83.', '172.58.84.', '172.58.85.', '172.58.86.', '172.58.87.', '172.58.88.', '172.58.89.', '172.58.90.', '172.58.91.', '172.58.92.', '172.58.93.', '172.58.94.', '172.58.95.', '172.58.96.', '172.58.98.', '172.58.97.', '172.58.99.', '172.58.100.', '172.58.101.', '172.58.102.', '172.58.103.', '172.58.104.', '172.58.105.', '172.58.106.', '172.58.107.', '172.58.108.', '172.58.109.', '172.58.110.', '172.58.111.', '172.58.112.', '172.58.113.', '172.58.114.', '172.58.115.', '172.58.116.', '172.58.117.', '172.58.119.', '172.58.118.', '172.58.121.', '172.58.120.', '172.58.122.', '172.58.125.', '172.58.123.', '172.58.124.', '172.58.126.', '172.58.127.', '172.58.129.', '172.58.128.', '172.58.131.', '172.58.130.', '172.58.133.', '172.58.132.', '172.58.134.', '172.58.135.', '172.58.136.', '172.58.137.', '172.58.138.', '172.58.140.', '172.58.139.', '172.58.142.', '172.58.141.', '172.58.143.', '172.58.144.', '172.58.145.', '172.58.146.', '172.58.147.', '172.58.148.', '172.58.149.', '172.58.150.', '172.58.151.', '172.58.152.', '172.58.153.', '172.58.155.', '172.58.154.', '172.58.156.', '172.58.157.', '172.58.158.', '172.58.159.', '172.58.160.', '172.58.161.', '172.58.162.', '172.58.163.', '172.58.164.', '172.58.165.', '172.58.166.', '172.58.167.', '172.58.168.', '172.58.169.', '172.58.171.', '172.58.170.', '172.58.172.', '172.58.174.', '172.58.173.', '172.58.175.', '172.58.176.', '172.58.177.', '172.58.178.', '172.58.179.', '172.58.180.', '172.58.181.', '172.58.182.', '172.58.184.', '172.58.183.', '172.58.185.', '172.58.186.', '172.58.187.', '172.58.188.', '172.58.189.', '172.58.191.', '172.58.190.', '172.58.192.', '172.58.193.', '172.58.194.', '172.58.195.', '172.58.196.', '172.58.197.', '172.58.198.', '172.58.199.', '172.58.200.', '172.58.201.', '172.58.202.', '172.58.203.', '172.58.204.', '172.58.205.', '172.58.206.', '172.58.207.', '172.58.208.', '172.58.209.', '172.58.210.', '172.58.211.', '172.58.212.', '172.58.213.', '172.58.214.', '172.58.216.', '172.58.215.', '172.58.219.', '172.58.218.', '172.58.217.', '172.58.220.', '172.58.221.', '172.58.222.', '172.58.225.', '172.58.223.', '172.58.224.', '172.58.227.', '172.58.226.', '172.58.228.', '172.58.229.', '172.58.230.', '172.58.232.', '172.58.231.', '172.58.233.', '172.58.235.', '172.58.237.', '172.58.234.', '172.58.236.', '172.58.238.', '172.58.239.', '172.58.240.', '172.58.241.', '172.58.243.', '172.58.242.', '172.58.245.', '172.58.244.', '172.58.247.', '172.58.246.', '172.58.248.', '172.58.249.', '172.58.250.', '172.58.251.', '172.58.252.', '172.58.253.', '172.58.254.', '172.58.255.', '172.56.134.', '172.58.217.', '172.58.216.', '172.58.218.', '172.58.219.', '172.58.220.', '172.58.221.', '172.58.222.', '172.58.223.', '208.54.17.', '208.54.16.', '172.58.72.', '172.58.73.', '172.58.74.', '172.58.75.', '172.58.76.', '172.58.77.', '172.58.78.', '206.29.188.', '172.58.79.', '206.29.189.', '208.54.40.', '208.54.75.', '208.54.74.', '208.54.0.', '208.54.3.', '208.54.1.', '208.54.2.', '208.54.4.', '208.54.5.', '208.54.6.', '208.54.8.', '208.54.7.', '208.54.9.', '208.54.10.', '208.54.12.', '208.54.11.', '208.54.13.', '208.54.14.', '208.54.15.', '208.54.17.', '208.54.16.', '208.54.18.', '208.54.20.', '208.54.19.', '208.54.21.', '208.54.23.', '208.54.22.', '208.54.25.', '208.54.24.', '208.54.26.', '208.54.27.', '208.54.28.', '208.54.29.', '208.54.30.', '208.54.31.', '208.54.32.', '208.54.33.', '208.54.35.', '208.54.34.', '208.54.37.', '208.54.36.', '208.54.38.', '208.54.39.', '208.54.40.', '208.54.41.', '208.54.43.', '208.54.42.', '208.54.45.', '208.54.44.', '208.54.47.', '208.54.48.', '208.54.46.', '208.54.49.', '208.54.50.', '208.54.51.', '208.54.52.', '208.54.53.', '208.54.54.', '208.54.55.', '208.54.56.', '208.54.57.', '208.54.59.', '208.54.60.', '208.54.58.', '208.54.62.', '208.54.61.', '208.54.63.', '208.54.64.', '208.54.65.', '208.54.66.', '208.54.67.', '208.54.69.', '208.54.68.', '208.54.71.', '208.54.70.', '208.54.72.', '208.54.73.', '208.54.74.', '208.54.75.', '208.54.76.', '208.54.77.', '208.54.78.', '208.54.79.', '208.54.80.', '208.54.81.', '208.54.82.', '208.54.83.', '208.54.84.', '208.54.85.', '208.54.86.', '208.54.87.', '208.54.88.', '208.54.89.', '208.54.90.', '208.54.91.', '208.54.92.', '208.54.93.', '208.54.94.', '208.54.95.', '208.54.96.', '208.54.97.', '208.54.99.', '208.54.98.', '208.54.100.', '208.54.101.', '208.54.103.', '208.54.102.', '208.54.105.', '208.54.104.', '208.54.106.', '208.54.107.', '208.54.108.', '208.54.109.', '208.54.110.', '208.54.111.', '208.54.113.', '208.54.112.', '208.54.114.', '208.54.115.', '208.54.116.', '208.54.117.', '208.54.118.', '208.54.119.', '208.54.120.', '208.54.121.', '208.54.122.', '208.54.123.', '208.54.124.', '208.54.125.', '208.54.126.', '208.54.127.', '208.54.36.', '208.54.34.', '208.54.67.', '208.54.18.', '172.56.140.', '172.56.146.', '172.56.136.', '172.56.138.', '172.56.40.', '172.56.41.', '172.58.24.', '172.58.25.', '172.58.26.', '172.58.27.', '172.58.28.', '172.58.29.', '172.58.30.', '172.58.31.', '172.58.33.', '172.58.32.', '172.58.35.', '172.58.34.', '172.58.37.', '172.58.36.', '172.58.38.', '172.58.39.', '172.58.65.', '172.58.66.', '172.58.67.', '172.58.64.', '172.58.69.', '172.58.68.', '172.58.70.', '172.58.71.', '172.58.232.', '172.58.233.', '172.58.234.', '172.58.235.', '172.58.236.', '172.58.238.', '172.58.239.', '172.58.237.', '172.56.20.', '172.56.21.', '172.58.1.', '172.58.3.', '172.58.0.', '172.58.2.', '172.58.4.', '172.58.7.', '172.58.5.', '172.58.6.', '172.58.224.', '172.58.225.', '172.58.227.', '172.58.226.', '172.58.229.', '172.58.230.', '172.58.228.', '172.58.231.', '172.58.200.', '172.58.202.', '172.58.201.', '172.58.203.', '172.58.205.', '172.58.204.', '172.58.206.', '172.58.207.', '174.141.209.', '174.141.210.', '174.141.208.', '174.141.211.', '174.141.213.', '174.141.212.', '174.141.214.', '174.141.216.', '174.141.215.', '174.141.217.', '174.141.218.', '174.141.219.', '174.141.220.', '174.141.221.', '174.141.222.', '174.141.223.', '208.54.39.', '172.58.152.', '172.58.155.', '172.58.154.', '172.58.153.', '172.58.156.', '172.58.158.', '172.58.157.', '172.58.159.', '172.58.170.', '172.58.168.', '172.58.171.', '172.58.169.', '172.58.174.', '172.58.173.', '172.58.172.', '172.58.175.', '206.29.190.', '206.29.191.', '208.54.35.', '208.54.4.', '208.54.19.', '208.54.20.', '208.54.33.', '208.54.7.', '172.56.28.', '172.56.29.', '172.58.137.', '172.58.139.', '172.58.138.', '172.58.136.', '172.58.140.', '172.58.141.', '172.58.142.', '172.56.132.', '172.58.143.', '208.54.2.', '100.128.0.', '100.128.1.', '100.128.3.', '100.128.2.', '100.128.5.', '100.128.4.', '100.128.6.', '100.128.8.', '100.128.7.', '100.128.9.', '100.128.11.', '100.128.12.', '100.128.13.', '100.128.10.', '100.128.14.', '100.128.15.', '100.128.16.', '100.128.17.', '100.128.18.', '100.128.20.', '100.128.19.', '100.128.21.', '100.128.22.', '100.128.23.', '100.128.25.', '100.128.24.', '100.128.26.', '100.128.27.', '100.128.29.', '100.128.28.', '100.128.30.', '100.128.31.', '100.128.32.', '100.128.34.', '100.128.35.', '100.128.33.', '100.128.36.', '100.128.37.', '100.128.38.', '100.128.41.', '100.128.39.', '100.128.40.', '100.128.42.', '100.128.43.', '100.128.45.', '100.128.44.', '100.128.46.', '100.128.47.', '100.128.49.', '100.128.48.', '100.128.50.', '100.128.51.', '100.128.53.', '100.128.52.', '100.128.54.', '100.128.56.', '100.128.55.', '100.128.57.', '100.128.58.', '100.128.59.', '100.128.60.', '100.128.61.', '100.128.62.', '100.128.63.', '100.128.64.', '100.128.65.', '100.128.66.', '100.128.67.', '100.128.68.', '100.128.69.', '100.128.70.', '100.128.71.', '100.128.72.', '100.128.73.', '100.128.74.', '100.128.75.', '100.128.76.', '100.128.77.', '100.128.79.', '100.128.80.', '100.128.78.', '100.128.81.', '100.128.82.', '100.128.84.', '100.128.83.', '100.128.85.', '100.128.86.', '100.128.87.', '100.128.88.', '100.128.89.', '100.128.90.', '100.128.92.', '100.128.91.', '100.128.94.', '100.128.93.', '100.128.95.', '100.128.96.', '100.128.97.', '100.128.99.', '100.128.98.', '100.128.100.', '100.128.101.', '100.128.103.', '100.128.104.', '100.128.102.', '100.128.105.', '100.128.106.', '100.128.107.', '100.128.108.', '100.128.109.', '100.128.110.', '100.128.111.', '100.128.112.', '100.128.113.', '100.128.114.', '100.128.116.', '100.128.115.', '100.128.117.', '100.128.119.', '100.128.118.', '100.128.120.', '100.128.121.', '100.128.122.', '100.128.123.', '100.128.124.', '100.128.125.', '100.128.126.', '100.128.127.', '100.128.128.', '100.128.129.', '100.128.130.', '100.128.131.', '100.128.132.', '100.128.133.', '100.128.134.', '100.128.135.', '100.128.136.', '100.128.137.', '100.128.138.', '100.128.139.', '100.128.140.', '100.128.141.', '100.128.142.', '100.128.143.', '100.128.144.', '100.128.145.', '100.128.146.', '100.128.147.', '100.128.148.', '100.128.150.', '100.128.149.', '100.128.151.', '100.128.152.', '100.128.153.', '100.128.155.', '100.128.154.', '100.128.157.', '100.128.156.', '100.128.158.', '100.128.160.', '100.128.159.', '100.128.161.', '100.128.163.', '100.128.162.', '100.128.165.', '100.128.164.', '100.128.166.', '100.128.167.', '100.128.168.', '100.128.169.', '100.128.171.', '100.128.173.', '100.128.170.', '100.128.172.', '100.128.174.', '100.128.175.', '100.128.176.', '100.128.177.', '100.128.178.', '100.128.179.', '100.128.180.', '100.128.181.', '100.128.183.', '100.128.182.', '100.128.184.', '100.128.185.', '100.128.186.', '100.128.187.', '100.128.188.', '100.128.189.', '100.128.190.', '100.128.191.', '100.128.192.', '100.128.193.', '100.128.194.', '100.128.195.', '100.128.196.', '100.128.197.', '100.128.198.', '100.128.199.', '100.128.200.', '100.128.201.', '100.128.202.', '100.128.203.', '100.128.204.', '100.128.205.', '100.128.206.', '100.128.207.', '100.128.208.', '100.128.209.', '100.128.211.', '100.128.210.', '100.128.212.', '100.128.214.', '100.128.213.', '100.128.215.', '100.128.216.', '100.128.217.', '100.128.219.', '100.128.218.', '100.128.221.', '100.128.220.', '100.128.222.', '100.128.223.', '100.128.224.', '100.128.225.', '100.128.226.', '100.128.227.', '100.128.228.', '100.128.229.', '100.128.230.', '100.128.231.', '100.128.232.', '100.128.233.', '100.128.234.', '100.128.235.', '100.128.236.', '100.128.238.', '100.128.237.', '100.128.240.', '100.128.239.', '100.128.241.', '100.128.242.', '100.128.243.', '100.128.245.', '100.128.244.', '100.128.246.', '100.128.248.', '100.128.249.', '100.128.250.', '100.128.247.', '100.128.251.', '100.128.252.', '100.128.253.', '100.128.254.', '100.128.255.', '172.56.38.', '172.56.39.', '206.29.168.', '206.29.169.', '172.56.0.', '206.29.170.', '206.29.171.', '172.56.2.', '172.56.3.', '172.56.1.', '172.56.4.', '172.56.5.', '172.56.6.', '172.56.7.', '172.56.9.', '172.56.8.', '172.56.10.', '172.56.11.', '172.56.13.', '172.56.12.', '172.56.14.', '172.56.15.', '172.56.17.', '172.56.16.', '172.56.18.', '172.56.19.', '172.56.21.', '172.56.20.', '172.56.23.', '172.56.22.', '172.56.24.', '172.56.25.', '172.56.26.', '172.56.27.', '172.56.29.', '172.56.30.', '172.56.31.', '172.56.28.', '172.56.32.', '172.56.33.', '172.56.34.', '172.56.36.', '172.56.35.', '172.56.37.', '172.56.39.', '172.56.38.', '172.56.40.', '172.56.41.', '172.56.43.', '172.56.42.', '172.56.44.', '172.56.45.', '172.56.47.', '172.56.46.', '172.56.48.', '172.56.49.', '172.56.50.', '172.56.51.', '172.56.52.', '172.56.53.', '172.56.54.', '172.56.55.', '172.56.57.', '172.56.56.', '172.56.58.', '172.56.59.', '172.56.60.', '172.56.61.', '172.56.63.', '172.56.65.', '172.56.62.', '172.56.64.', '172.56.67.', '172.56.66.', '172.56.68.', '172.56.69.', '172.56.71.', '172.56.70.', '172.56.73.', '172.56.72.', '172.56.74.', '172.56.75.', '172.56.76.', '172.56.77.', '172.56.78.', '172.56.79.', '172.56.80.', '172.56.83.', '172.56.82.', '172.56.81.', '172.56.84.', '172.56.86.', '172.56.85.', '172.56.88.', '172.56.87.', '172.56.89.', '172.56.90.', '172.56.91.', '172.56.92.', '172.56.94.', '172.56.93.', '172.56.95.', '172.56.96.', '172.56.97.', '172.56.98.', '172.56.99.', '172.56.101.', '172.56.100.', '172.56.102.', '172.56.103.', '172.56.105.', '172.56.106.', '172.56.104.', '172.56.107.', '172.56.108.', '172.56.110.', '172.56.109.', '172.56.111.', '172.56.112.', '172.56.113.', '172.56.114.', '172.56.115.', '172.56.116.', '172.56.117.', '172.56.118.', '172.56.119.', '172.56.120.', '172.56.121.', '172.56.122.', '172.56.123.', '172.56.124.', '172.56.125.', '172.56.126.', '172.56.127.', '172.56.129.', '172.56.128.', '172.56.131.', '172.56.132.', '172.56.130.', '172.56.134.', '172.56.133.', '172.56.136.', '172.56.135.', '172.56.137.', '172.56.138.', '172.56.141.', '172.56.139.', '172.56.143.', '172.56.140.', '172.56.142.', '172.56.145.', '172.56.144.', '172.56.146.', '172.56.147.', '172.56.148.', '172.56.150.', '172.56.149.', '172.56.151.', '172.56.153.', '172.56.152.', '172.56.154.', '172.56.155.', '172.56.156.', '172.56.157.', '172.56.158.', '172.56.159.', '172.56.160.', '172.56.161.', '172.56.162.', '172.56.163.', '172.56.165.', '172.56.164.', '172.56.166.', '172.56.167.', '172.56.169.', '172.56.168.', '172.56.170.', '172.56.171.', '172.56.172.', '172.56.173.', '172.56.175.', '172.56.174.', '172.56.176.', '172.56.177.', '172.56.178.', '172.56.179.', '172.56.180.', '172.56.181.', '172.56.182.', '172.56.183.', '172.56.185.', '172.56.184.', '172.56.186.', '172.56.187.', '172.56.188.', '172.56.189.', '172.56.190.', '172.56.191.', '172.56.192.', '172.56.193.', '172.56.194.', '172.56.196.', '172.56.197.', '172.56.195.', '172.56.198.', '172.56.199.', '172.56.201.', '172.56.200.', '172.56.202.', '172.56.204.', '172.56.205.', '172.56.203.', '172.56.206.', '172.56.207.', '172.56.208.', '172.56.209.', '172.56.211.', '172.56.210.', '172.56.214.', '172.56.212.', '172.56.213.', '172.56.215.', '172.56.216.', '172.56.217.', '172.56.218.', '172.56.220.', '172.56.219.', '172.56.221.', '172.56.223.', '172.56.224.', '172.56.225.', '172.56.227.', '172.56.226.', '172.56.228.', '172.56.230.', '172.56.222.', '172.56.229.', '172.56.231.', '172.56.232.', '172.56.233.', '172.56.234.', '172.56.235.', '172.56.237.', '172.56.236.', '172.56.239.', '172.56.238.', '172.56.242.', '172.56.240.', '172.56.241.', '172.56.243.', '172.56.245.', '172.56.244.', '172.56.248.', '172.56.246.', '172.56.247.', '172.56.249.', '172.56.251.', '172.56.250.', '172.56.252.', '172.56.253.', '172.56.254.', '172.56.255.', '172.56.12.', '172.56.13.', '208.54.37.', '172.56.34.', '97.65.105.', '172.56.35.', '172.56.7.', '172.56.6.', '172.56.4.', '172.56.5.', '172.56.30.', '172.56.31.', '172.56.43.', '172.56.42.', '172.56.44.', '172.56.45.', '172.58.40.', '172.58.41.', '172.58.42.', '172.58.43.', '172.58.47.', '172.58.44.', '172.58.45.', '172.58.46.', '172.56.26.', '172.56.27.', '172.56.16.', '172.56.17.', '162.190.2.', '162.190.1.', '162.190.3.', '162.190.0.', '162.190.5.', '162.190.4.', '162.190.7.', '162.190.6.', '162.190.9.', '162.190.8.', '162.190.10.', '162.190.12.', '162.190.13.', '162.190.11.', '162.190.14.', '162.190.15.', '162.190.16.', '162.190.17.', '162.190.18.', '162.190.19.', '162.190.21.', '162.190.22.', '162.190.20.', '162.190.24.', '162.190.25.', '162.190.23.', '162.190.27.', '162.190.26.', '162.190.29.', '162.190.28.', '162.190.31.', '162.190.30.', '162.190.32.', '162.190.33.', '162.190.34.', '162.190.36.', '162.190.35.', '162.190.37.', '162.190.39.', '162.190.38.', '162.190.40.', '162.190.41.', '162.190.42.', '162.190.43.', '162.190.44.', '162.190.45.', '162.190.46.', '162.190.47.', '162.190.48.', '162.190.49.', '162.190.50.', '162.190.51.', '162.190.52.', '162.190.53.', '162.190.54.', '162.190.55.', '162.190.56.', '162.190.57.', '162.190.59.', '162.190.58.', '162.190.60.', '162.190.61.', '162.190.62.', '162.190.63.', '162.190.64.', '162.190.66.', '162.190.67.', '162.190.65.', '162.190.69.', '162.190.70.', '162.190.68.', '162.190.71.', '162.190.72.', '162.190.73.', '162.190.74.', '162.190.75.', '162.190.76.', '162.190.78.', '162.190.77.', '162.190.80.', '162.190.79.', '162.190.82.', '162.190.81.', '162.190.83.', '162.190.84.', '162.190.85.', '162.190.86.', '162.190.87.', '162.190.88.', '162.190.89.', '162.190.90.', '162.190.91.', '162.190.92.', '162.190.93.', '162.190.94.', '162.190.95.', '162.190.96.', '162.190.97.', '162.190.98.', '162.190.99.', '162.190.100.', '162.190.102.', '162.190.101.', '162.190.103.', '162.190.104.', '162.190.105.', '162.190.106.', '162.190.108.', '162.190.107.', '162.190.109.', '162.190.110.', '162.190.112.', '162.190.111.', '162.190.113.', '162.190.114.', '162.190.115.', '162.190.117.', '162.190.119.', '162.190.120.', '162.190.116.', '162.190.118.', '162.190.121.', '162.190.122.', '162.190.124.', '162.190.123.', '162.190.126.', '162.190.125.', '162.190.127.', '162.190.128.', '162.190.129.', '162.190.130.', '162.190.132.', '162.190.131.', '162.190.133.', '162.190.134.', '162.190.136.', '162.190.135.', '162.190.137.', '162.190.139.', '162.190.138.', '162.190.140.', '162.190.141.', '162.190.142.', '162.190.143.', '162.190.144.', '162.190.145.', '162.190.146.', '162.190.147.', '162.190.148.', '162.190.149.', '162.190.150.', '162.190.152.', '162.190.151.', '162.190.153.', '162.190.154.', '162.190.155.', '162.190.156.', '162.190.158.', '162.190.157.', '162.190.160.', '162.190.159.', '162.190.162.', '162.190.161.', '162.190.163.', '162.190.164.', '162.190.165.', '162.190.166.', '162.190.167.', '162.190.168.', '162.190.169.', '162.190.171.', '162.190.170.', '162.190.172.', '162.190.173.', '162.190.174.', '162.190.175.', '162.190.177.', '162.190.176.', '162.190.178.', '162.190.179.', '162.190.180.', '162.190.181.', '162.190.183.', '162.190.182.', '162.190.184.', '162.190.187.', '162.190.185.', '162.190.186.', '162.190.188.', '162.190.190.', '162.190.189.', '162.190.191.', '162.190.192.', '162.190.193.', '162.190.194.', '162.190.196.', '162.190.195.', '162.190.197.', '162.190.199.', '162.190.198.', '162.190.200.', '162.190.201.', '162.190.202.', '162.190.204.', '162.190.203.', '162.190.207.', '162.190.206.', '162.190.208.', '162.190.205.', '162.190.209.', '162.190.210.', '162.190.211.', '162.190.212.', '162.190.213.', '162.190.214.', '162.190.215.', '162.190.216.', '162.190.217.', '162.190.218.', '162.190.219.', '162.190.220.', '162.190.221.', '162.190.223.', '162.190.222.', '162.190.224.', '162.190.225.', '162.190.226.', '162.190.227.', '162.190.229.', '162.190.228.', '162.190.230.', '162.190.231.', '162.190.232.', '162.190.233.', '162.190.234.', '162.190.235.', '162.190.236.', '162.190.237.', '162.190.238.', '162.190.239.', '162.190.241.', '162.190.240.', '162.190.242.', '162.190.244.', '162.190.243.', '162.190.245.', '162.190.246.', '162.190.247.', '162.190.248.', '162.190.249.', '162.190.250.', '162.190.251.', '162.190.252.', '162.190.253.', '162.190.255.', '162.190.254.', '107.225.249.', '107.225.251.', '107.225.252.', '107.225.253.', '107.225.254.', '107.225.29.', '107.225.30.', '107.225.36.', '107.225.37.', '107.225.42.', '107.225.44.', '107.225.48.', '107.225.49.', '107.225.50.', '107.225.51.', '107.225.52.', '107.225.56.', '107.225.57.', '107.225.58.', '107.225.569.', '162.210.152.', '162.221.208.', '206.197.81.', '207.20.0.', '207.20.1.', '207.20.4.', '207.20.2.', '207.20.3.', '207.20.5.', '207.20.6.', '207.20.7.', '207.20.8.', '207.20.10.', '207.20.12.', '207.20.9.', '207.20.11.', '207.20.14.', '207.20.13.', '207.20.16.', '207.20.15.', '207.20.18.', '207.20.19.', '207.20.17.', '207.20.22.', '207.20.20.', '207.20.21.', '207.20.23.', '207.20.25.', '207.20.24.', '207.20.26.', '207.20.28.', '207.20.27.', '207.20.29.', '207.20.30.', '207.20.32.', '207.20.33.', '207.20.35.', '207.20.34.', '207.20.37.', '207.20.36.', '207.20.39.', '207.20.31.', '207.20.38.', '207.20.40.', '207.20.42.', '207.20.43.', '207.20.44.', '207.20.45.', '207.20.41.', '207.20.47.', '207.20.48.', '207.20.46.', '207.20.49.', '207.20.50.', '207.20.52.', '207.20.51.', '207.20.53.', '207.20.55.', '207.20.56.', '207.20.54.', '207.20.59.', '207.20.58.', '207.20.57.', '207.20.61.', '207.20.60.', '207.20.62.', '207.20.65.', '207.20.64.', '207.20.67.', '207.20.66.', '207.20.68.', '207.20.69.', '207.20.70.', '207.20.63.', '207.20.71.', '207.20.72.', '207.20.74.', '207.20.75.', '207.20.73.', '207.20.76.', '207.20.78.', '207.20.77.', '207.20.79.', '207.20.82.', '207.20.81.', '207.20.83.', '207.20.84.', '207.20.80.', '207.20.86.', '207.20.87.', '207.20.88.', '207.20.89.', '207.20.90.', '207.20.91.', '207.20.85.', '207.20.92.', '207.20.94.', '207.20.93.', '207.20.95.', '207.20.96.', '207.20.98.', '207.20.97.', '207.20.100.', '207.20.99.', '207.20.101.', '207.20.103.', '207.20.102.', '207.20.104.', '207.20.106.', '207.20.107.', '207.20.105.', '207.20.108.', '207.20.109.', '207.20.110.', '207.20.112.', '207.20.111.', '207.20.115.', '207.20.114.', '207.20.116.', '207.20.118.', '207.20.117.', '207.20.113.', '207.20.121.', '207.20.119.', '207.20.123.', '207.20.122.', '207.20.126.', '207.20.124.', '207.20.125.', '207.20.127.', '207.20.129.', '207.20.120.', '207.20.130.', '207.20.131.', '207.20.132.', '207.20.134.', '207.20.128.', '207.20.135.', '207.20.133.', '207.20.138.', '207.20.137.', '207.20.140.', '207.20.136.', '207.20.139.', '207.20.144.', '207.20.145.', '207.20.141.', '207.20.142.', '207.20.147.', '207.20.143.', '207.20.149.', '207.20.150.', '207.20.148.', '207.20.146.', '207.20.153.', '207.20.151.', '207.20.152.', '207.20.155.', '207.20.156.', '207.20.154.', '207.20.157.', '207.20.159.', '207.20.158.', '207.20.161.', '207.20.160.', '207.20.163.', '207.20.162.', '207.20.164.', '207.20.166.', '207.20.165.', '207.20.167.', '207.20.168.', '207.20.170.', '207.20.169.', '207.20.171.', '207.20.173.', '207.20.172.', '207.20.174.', '207.20.176.', '207.20.177.', '207.20.180.', '207.20.175.', '207.20.179.', '207.20.178.', '207.20.182.', '207.20.181.', '207.20.184.', '207.20.185.', '207.20.186.', '207.20.187.', '207.20.189.', '207.20.188.', '207.20.191.', '207.20.183.', '207.20.190.', '207.20.192.', '207.20.193.', '207.20.196.', '207.20.194.', '207.20.197.', '207.20.198.', '207.20.199.', '207.20.200.', '207.20.202.', '207.20.201.', '207.20.203.', '207.20.204.', '207.20.205.', '207.20.195.', '207.20.206.', '207.20.208.', '207.20.209.', '207.20.210.', '207.20.211.', '207.20.212.', '207.20.207.', '207.20.213.', '207.20.215.', '207.20.216.', '207.20.217.', '207.20.214.', '207.20.219.', '207.20.218.', '207.20.220.', '207.20.221.', '207.20.223.', '207.20.222.', '207.20.225.', '207.20.224.', '207.20.227.', '207.20.228.', '207.20.226.', '207.20.231.', '207.20.229.', '207.20.230.', '207.20.233.', '207.20.232.', '207.20.236.', '207.20.234.', '207.20.237.', '207.20.238.', '207.20.239.', '207.20.235.', '207.20.241.', '207.20.240.', '207.20.242.', '207.20.244.', '207.20.245.', '207.20.246.', '207.20.248.', '207.20.243.', '207.20.250.', '207.20.251.', '207.20.247.', '207.20.249.', '207.20.253.', '207.20.252.', '207.20.255.', '207.20.254.', '207.150.2.', '207.150.1.', '207.150.4.', '207.150.3.', '207.150.6.', '207.150.0.', '207.150.5.', '207.150.8.', '207.150.9.', '207.150.7.', '207.150.12.', '207.150.10.', '207.150.13.', '207.150.15.', '207.150.14.', '207.150.16.', '207.150.18.', '207.150.19.', '207.150.17.', '207.150.11.', '207.150.20.', '207.150.21.', '207.150.22.', '207.150.23.', '207.150.26.', '207.150.27.', '207.150.28.', '207.150.31.', '207.150.24.', '207.150.25.', '207.150.30.', '207.150.29.', '207.150.33.', '207.150.32.', '207.150.34.', '207.150.36.', '207.150.37.', '207.150.39.', '207.150.41.', '207.150.35.', '207.150.42.', '207.150.38.', '207.150.44.', '207.150.40.', '207.150.46.', '207.150.47.', '207.150.48.', '207.150.49.', '207.150.50.', '207.150.51.', '207.150.52.', '207.150.53.', '207.150.45.', '207.150.55.', '207.150.54.', '207.150.43.', '207.150.56.', '207.150.57.', '207.150.59.', '207.150.60.', '207.150.61.', '207.150.62.', '207.150.64.', '207.150.63.', '207.150.65.', '207.150.67.', '207.150.58.', '207.150.68.', '207.150.66.', '207.150.70.', '207.150.69.', '207.150.71.', '207.150.74.', '207.150.73.', '207.150.72.', '207.150.76.', '207.150.75.', '207.150.78.', '207.150.79.', '207.150.81.', '207.150.82.', '207.150.83.', '207.150.77.', '207.150.84.', '207.150.80.', '207.150.86.', '207.150.87.', '207.150.85.', '207.150.90.', '207.150.89.', '207.150.88.', '207.150.93.', '207.150.94.', '207.150.91.', '207.150.96.', '207.150.92.', '207.150.95.', '207.150.97.', '207.150.99.', '207.150.98.', '207.150.100.', '207.150.101.', '207.150.104.', '207.150.103.', '207.150.102.', '207.150.106.', '207.150.107.', '207.150.105.', '207.150.110.', '207.150.109.', '207.150.112.', '207.150.108.', '207.150.114.', '207.150.113.', '207.150.115.', '207.150.116.', '207.150.118.', '207.150.119.', '207.150.117.', '207.150.121.', '207.150.122.', '207.150.123.', '207.150.124.', '207.150.111.', '207.150.120.', '207.150.125.', '207.150.127.', '207.150.126.', '207.55.128.', '207.55.129.', '207.55.131.', '207.55.130.', '207.55.133.', '207.55.132.', '207.55.134.', '207.55.135.', '207.55.138.', '207.55.137.', '207.55.141.', '207.55.136.', '207.55.140.', '207.55.142.', '207.55.144.', '207.55.143.', '207.55.139.', '207.55.145.', '207.55.146.', '207.55.148.', '207.55.150.', '207.55.151.', '207.55.147.', '207.55.149.', '207.55.154.', '207.55.153.', '207.55.156.', '207.55.152.', '207.55.157.', '207.55.159.', '207.55.155.', '207.55.158.', '207.55.161.', '207.55.162.', '207.55.164.', '207.55.163.', '207.55.166.', '207.55.168.', '207.55.167.', '207.55.169.', '207.55.160.', '207.55.171.', '207.55.165.', '207.55.172.', '207.55.170.', '207.55.173.', '207.55.174.', '207.55.177.', '207.55.175.', '207.55.176.', '207.55.180.', '207.55.178.', '207.55.179.', '207.55.182.', '207.55.183.', '207.55.181.', '207.55.184.', '207.55.186.', '207.55.187.', '207.55.189.', '207.55.185.', '207.55.191.', '207.55.190.', '207.55.188.', '207.97.2.', '207.97.3.', '207.97.0.', '207.97.5.', '207.97.1.', '207.97.4.', '207.97.7.', '207.97.8.', '207.97.6.', '207.97.10.', '207.97.11.', '207.97.13.', '207.97.9.', '207.97.14.', '207.97.15.', '207.97.12.', '207.97.16.', '207.97.17.', '207.97.19.', '207.97.20.', '207.97.21.', '207.97.18.', '207.97.24.', '207.97.22.', '207.97.26.', '207.97.23.', '207.97.25.', '207.97.28.', '207.97.29.', '207.97.27.', '207.97.31.', '207.97.32.', '207.97.33.', '207.97.30.', '207.97.34.', '207.97.37.', '207.97.35.', '207.97.36.', '207.97.38.', '207.97.40.', '207.97.39.', '207.97.41.', '207.97.43.', '207.97.44.', '207.97.42.', '207.97.46.', '207.97.48.', '207.97.45.', '207.97.47.', '207.97.50.', '207.97.51.', '207.97.49.', '207.97.54.', '207.97.53.', '207.97.52.', '207.97.55.', '207.97.57.', '207.97.58.', '207.97.60.', '207.97.56.', '207.97.62.', '207.97.63.', '207.97.64.', '207.97.65.', '207.97.66.', '207.97.67.', '207.97.68.', '207.97.61.', '207.97.69.', '207.97.70.', '207.97.71.', '207.97.72.', '207.97.73.', '207.97.74.', '207.97.76.', '207.97.59.', '207.97.77.', '207.97.78.', '207.97.79.', '207.97.75.', '207.97.81.', '207.97.82.', '207.97.83.', '207.97.84.', '207.97.85.', '207.97.87.', '207.97.88.', '207.97.80.', '207.97.86.', '207.97.89.', '207.97.90.', '207.97.92.', '207.97.93.', '207.97.91.', '207.97.95.', '207.97.96.', '207.97.97.', '207.97.94.', '207.97.98.', '207.97.100.', '207.97.102.', '207.97.99.', '207.97.103.', '207.97.104.', '207.97.105.', '207.97.101.', '207.97.108.', '207.97.106.', '207.97.109.', '207.97.111.', '207.97.110.', '207.97.107.', '207.97.114.', '207.97.115.', '207.97.112.', '207.97.113.', '207.97.117.', '207.97.118.', '207.97.116.', '207.97.119.', '207.97.121.', '207.97.120.', '207.97.122.', '207.97.123.', '207.97.124.', '207.97.125.', '207.97.127.', '207.150.128.', '207.150.129.', '207.150.130.', '207.150.131.', '207.150.133.', '207.97.126.', '207.150.132.', '207.150.134.', '207.150.135.', '207.150.136.', '207.150.139.', '207.150.138.', '207.150.141.', '207.150.140.', '207.150.137.', '207.150.143.', '207.150.145.', '207.150.146.', '207.150.144.', '207.150.148.', '207.150.147.', '207.150.142.', '207.150.151.', '207.150.149.', '207.150.153.', '207.150.150.', '207.150.155.', '207.150.152.', '207.150.156.', '207.150.154.', '207.150.158.', '207.150.159.', '207.150.157.', '206.213.65.', '206.213.64.', '206.213.67.', '206.213.68.', '206.213.66.', '206.213.70.', '206.213.71.', '206.213.69.', '206.213.75.', '206.213.73.', '206.213.74.', '206.213.76.', '206.213.77.', '206.213.79.', '206.213.80.', '206.213.78.', '206.213.81.', '206.213.72.', '206.213.83.', '206.213.82.', '206.213.85.', '206.213.87.', '206.213.84.', '206.213.86.', '206.213.89.', '206.213.88.', '206.213.90.', '206.213.91.', '206.213.92.', '206.213.94.', '206.213.96.', '206.213.95.', '206.213.98.', '206.213.99.', '206.213.93.', '206.213.97.', '206.213.100.', '206.213.101.', '206.213.104.', '206.213.103.', '206.213.105.', '206.213.102.', '206.213.107.', '206.213.109.', '206.213.108.', '206.213.111.', '206.213.110.', '206.213.114.', '206.213.113.', '206.213.112.', '206.213.106.', '206.213.116.', '206.213.115.', '206.213.118.', '206.213.119.', '206.213.117.', '206.213.121.', '206.213.120.', '206.213.124.', '206.213.122.', '206.213.123.', '206.213.125.', '206.213.127.', '206.213.126.', '207.137.0.', '207.137.3.', '207.137.2.', '207.137.4.', '207.137.1.', '207.137.6.', '207.137.5.', '207.137.9.', '207.137.7.', '207.137.11.', '207.137.10.', '207.137.12.', '207.137.14.', '207.137.13.', '207.137.16.', '207.137.8.', '207.137.15.', '207.137.18.', '207.137.20.', '207.137.19.', '207.137.17.', '207.137.21.', '207.137.23.', '207.137.25.', '207.137.22.', '207.137.24.', '207.137.28.', '207.137.27.', '207.137.29.', '207.137.31.', '207.137.26.', '207.137.33.', '207.137.30.', '207.137.32.', '207.137.35.', '207.137.37.', '207.137.36.', '207.137.38.', '207.137.34.', '207.137.39.', '207.137.41.', '207.137.40.', '207.137.44.', '207.137.43.', '207.137.45.', '207.137.47.', '207.137.46.', '207.137.49.', '207.137.48.', '207.137.51.', '207.137.50.', '207.137.53.', '207.137.52.', '207.137.55.', '207.137.42.', '207.137.58.', '207.137.56.', '207.137.57.', '207.137.54.', '207.137.59.', '207.137.61.', '207.137.62.', '207.137.60.', '207.137.64.', '207.137.66.', '207.137.67.', '207.137.70.', '207.137.65.', '207.137.63.', '207.137.68.', '207.137.71.', '207.137.72.', '207.137.69.', '207.137.75.', '207.137.74.', '207.137.76.', '207.137.78.', '207.137.77.', '207.137.79.', '207.137.81.', '207.137.80.', '207.137.73.', '207.137.82.', '207.137.85.', '207.137.84.', '207.137.86.', '207.137.83.', '207.137.88.', '207.137.87.', '207.137.89.', '207.137.91.', '207.137.93.', '207.137.92.', '207.137.95.', '207.137.94.', '207.137.97.', '207.137.90.', '207.137.98.', '207.137.100.', '207.137.96.', '207.137.101.', '207.137.103.', '207.137.99.', '207.137.102.', '207.137.105.', '207.137.104.', '207.137.106.', '207.137.107.', '207.137.108.', '207.137.109.', '207.137.110.', '207.137.111.', '207.137.112.', '207.137.115.', '207.137.114.', '207.137.113.', '207.137.118.', '207.137.117.', '207.137.119.', '207.137.120.', '207.137.121.', '207.137.122.', '207.137.124.', '207.137.123.', '207.137.125.', '207.137.116.', '207.137.126.', '207.137.128.', '207.137.129.', '207.137.130.', '207.137.127.', '207.137.131.', '207.137.133.', '207.137.132.', '207.137.136.', '207.137.135.', '207.137.137.', '207.137.138.', '207.137.139.', '207.137.141.', '207.137.140.', '207.137.134.', '207.137.143.', '207.137.144.', '207.137.145.', '207.137.147.', '207.137.146.', '207.137.149.', '207.137.142.', '207.137.150.', '207.137.151.', '207.137.153.', '207.137.148.', '207.137.154.', '207.137.155.', '207.137.156.', '207.137.157.', '207.137.158.', '207.137.159.', '207.137.160.', '207.137.162.', '207.137.163.', '207.137.164.', '207.137.161.', '207.137.152.', '207.137.165.', '207.137.167.', '207.137.168.', '207.137.169.', '207.137.170.', '207.137.172.', '207.137.166.', '207.137.173.', '207.137.174.', '207.137.171.', '207.137.176.', '207.137.177.', '207.137.179.', '207.137.180.', '207.137.181.', '207.137.182.', '207.137.183.', '207.137.186.', '207.137.187.', '207.137.185.', '207.137.188.', '207.137.190.', '207.137.191.', '207.137.189.', '207.137.192.', '207.137.193.', '207.137.194.', '207.137.195.', '207.137.196.', '207.137.197.', '207.137.199.', '207.137.184.', '207.137.198.', '207.137.200.', '207.137.201.', '207.137.178.', '207.137.175.', '207.137.202.', '207.137.204.', '207.137.205.', '207.137.203.', '207.137.208.', '207.137.207.', '207.137.210.', '207.137.206.', '207.137.212.', '207.137.211.', '207.137.214.', '207.137.213.', '207.137.215.', '207.137.209.', '207.137.218.', '207.137.217.', '207.137.220.', '207.137.219.', '207.137.222.', '207.137.221.', '207.137.225.', '207.137.223.', '207.137.226.', '207.137.224.', '207.137.228.', '207.137.227.', '207.137.216.', '207.137.230.', '207.137.229.', '207.137.231.', '207.137.232.', '207.137.233.', '207.137.234.', '207.137.235.', '207.137.236.', '207.137.237.', '207.137.238.', '207.137.239.', '207.137.240.', '207.137.241.', '207.137.242.', '207.137.243.', '207.137.244.', '207.137.245.', '207.137.246.', '207.137.247.', '207.137.248.', '207.137.249.', '207.137.250.', '207.137.251.', '207.137.252.', '207.137.253.', '207.137.254.', '207.137.255.', '207.56.0.', '207.56.1.', '207.56.2.', '207.56.3.', '207.56.4.', '207.56.5.', '207.56.6.', '207.56.7.', '207.56.8.', '207.56.9.', '207.56.10.', '207.56.11.', '207.56.12.', '207.56.13.', '207.56.14.', '207.56.15.', '207.56.16.', '207.56.17.', '207.56.18.', '207.56.19.', '207.56.20.', '207.56.21.', '207.56.22.', '207.56.23.', '207.56.25.', '207.56.24.', '207.56.26.', '207.56.27.', '207.56.28.', '207.56.29.', '207.56.30.', '207.56.31.', '207.56.32.', '207.56.34.', '207.56.33.', '207.56.35.', '207.56.36.', '207.56.37.', '207.56.38.', '207.56.39.', '207.56.40.', '207.56.41.', '207.56.42.', '207.56.43.', '207.56.44.', '207.56.46.', '207.56.45.', '207.56.50.', '207.56.49.', '207.56.47.', '207.56.48.', '207.56.51.', '207.56.53.', '207.56.52.', '207.56.54.', '207.56.55.', '207.56.56.', '207.56.57.', '207.56.59.', '207.56.61.', '207.56.58.', '207.56.60.', '207.56.63.', '207.56.62.', '207.56.65.', '207.56.66.', '207.56.64.', '207.56.69.', '207.56.68.', '207.56.70.', '207.56.71.', '207.56.72.', '207.56.73.', '207.56.74.', '207.56.75.', '207.56.76.', '207.56.77.', '207.56.78.', '207.56.79.', '207.56.80.', '207.56.81.', '207.56.82.', '207.56.83.', '207.56.85.', '207.56.84.', '207.56.86.', '207.56.87.', '207.56.88.', '207.56.89.', '207.56.91.', '207.56.90.', '207.56.92.', '207.56.93.', '207.56.94.', '207.56.95.', '207.56.67.', '207.56.96.', '207.56.97.', '207.56.98.', '207.56.99.', '207.56.101.', '207.56.100.', '207.56.103.', '207.56.104.', '207.56.105.', '207.56.102.', '207.56.106.', '207.56.107.', '207.56.108.', '207.56.109.', '207.56.110.', '207.56.111.', '207.56.112.', '207.56.113.', '207.56.114.', '207.56.115.', '207.56.116.', '207.56.117.', '207.56.118.', '207.56.119.', '207.56.120.', '207.56.121.', '207.56.122.', '207.56.123.', '207.56.124.', '207.56.125.', '207.56.126.', '207.56.128.', '207.56.127.', '207.56.129.', '207.56.130.', '207.56.131.', '207.56.133.', '207.56.134.', '207.56.132.', '207.56.135.', '207.56.136.', '207.56.137.', '207.56.138.', '207.56.139.', '207.56.140.', '207.56.141.', '207.56.142.', '207.56.143.', '207.56.144.', '207.56.145.', '207.56.146.', '207.56.147.', '207.56.148.', '207.56.149.', '207.56.150.', '207.56.151.', '207.56.152.', '207.56.153.', '207.56.154.', '207.56.155.', '207.56.156.', '207.56.158.', '207.56.159.', '207.56.160.', '207.56.161.', '207.56.163.', '207.56.162.', '207.56.164.', '207.56.165.', '207.56.166.', '207.56.157.', '207.56.167.', '207.56.168.', '207.56.169.', '207.56.172.', '207.56.171.', '207.56.175.', '207.56.173.', '207.56.170.', '207.56.174.', '207.56.176.', '207.56.177.', '207.56.178.', '207.56.179.', '207.56.181.', '207.56.180.', '207.56.182.', '207.56.184.', '207.56.183.', '207.56.185.', '207.56.186.', '207.56.187.', '207.56.188.', '207.56.189.', '207.56.190.', '207.56.191.', '207.56.193.', '207.56.192.', '207.56.194.', '207.56.195.', '207.56.196.', '207.56.197.', '207.56.198.', '207.56.199.', '207.56.200.', '207.56.202.', '207.56.201.', '207.56.203.', '207.56.204.', '207.56.205.', '207.56.206.', '207.56.207.', '207.56.208.', '207.56.209.', '207.56.211.', '207.56.210.', '207.56.212.', '207.56.213.', '207.56.214.', '207.56.215.', '207.56.217.', '207.56.216.', '207.56.218.', '207.56.219.', '207.56.221.', '207.56.223.', '207.56.222.', '207.56.220.', '207.56.225.', '207.56.224.', '207.56.227.', '207.56.226.', '207.56.228.', '207.56.229.', '207.56.230.', '207.56.231.', '207.56.232.', '207.56.233.', '207.56.235.', '207.56.234.', '207.56.236.', '207.56.237.', '207.56.238.', '207.56.240.', '207.56.239.', '207.56.241.', '207.56.242.', '207.56.244.', '207.56.243.', '207.56.245.', '207.56.246.', '207.56.248.', '207.56.247.', '207.56.249.', '207.56.250.', '207.56.251.', '207.56.253.', '207.56.252.', '207.56.254.', '207.56.255.', '207.71.64.', '207.71.65.', '207.71.66.', '207.71.67.', '207.71.68.', '207.71.69.', '207.71.71.', '207.71.70.', '207.71.72.', '207.71.73.', '207.71.75.', '207.71.74.', '207.71.77.', '207.71.76.', '207.71.79.', '207.71.78.', '207.71.81.', '207.71.80.', '207.71.83.', '207.71.82.', '207.71.84.', '207.71.85.', '207.71.87.', '207.71.86.', '207.71.88.', '207.71.90.', '207.71.89.', '207.71.91.', '207.71.92.', '207.71.93.', '207.71.94.', '207.71.95.', '207.71.96.', '207.71.97.', '207.71.98.', '207.71.99.', '207.71.100.', '207.71.101.', '207.71.102.', '207.71.103.', '207.71.104.', '207.71.105.', '207.71.106.', '207.71.107.', '207.71.108.', '207.71.109.', '207.71.110.', '207.71.111.', '207.71.112.', '207.71.113.', '207.71.114.', '207.71.115.', '207.71.116.', '207.71.117.', '207.71.118.', '207.71.119.', '207.71.120.', '207.71.121.', '207.71.122.', '207.71.123.', '207.71.124.', '207.71.125.', '207.71.127.', '207.71.126.', '206.222.32.', '206.222.33.', '206.222.34.', '206.222.35.', '206.222.36.', '206.222.37.', '206.222.39.', '206.222.41.', '206.222.40.', '206.222.43.', '206.222.42.', '206.222.45.', '206.222.38.', '206.222.46.', '206.222.47.', '206.222.48.', '206.222.44.', '206.222.51.', '206.222.50.', '206.222.52.', '206.222.53.', '206.222.54.', '206.222.49.', '206.222.57.', '206.222.58.', '206.222.56.', '206.222.60.', '206.222.59.', '206.222.55.', '206.222.61.', '206.222.63.', '206.222.62.', '207.21.129.', '207.21.128.', '207.21.130.', '207.21.131.', '207.21.133.', '207.21.134.', '207.21.132.', '207.21.135.', '207.21.137.', '207.21.136.', '207.21.138.', '207.21.140.', '207.21.143.', '207.21.141.', '207.21.142.', '207.21.139.', '207.21.144.', '207.21.145.', '207.21.147.', '207.21.146.', '207.21.148.', '207.21.150.', '207.21.151.', '207.21.152.', '207.21.149.', '207.21.153.', '207.21.154.', '207.21.156.', '207.21.157.', '207.21.158.', '207.21.155.', '207.21.161.', '207.21.160.', '207.21.162.', '207.21.163.', '207.21.164.', '207.21.159.', '207.21.165.', '207.21.167.', '207.21.168.', '207.21.166.', '207.21.171.', '207.21.170.', '207.21.172.', '207.21.169.', '207.21.175.', '207.21.174.', '207.21.176.', '207.21.173.', '207.21.179.', '207.21.180.', '207.21.178.', '207.21.177.', '207.21.184.', '207.21.183.', '207.21.182.', '207.21.185.', '207.21.181.', '207.21.189.', '207.21.187.', '207.21.190.', '207.21.188.', '207.21.191.', '207.21.186.', '207.32.64.', '207.32.67.', '207.32.66.', '207.32.65.', '207.32.68.', '207.32.69.', '207.32.70.', '207.32.72.', '207.32.73.', '207.32.71.', '207.32.76.', '207.32.74.', '207.32.77.', '207.32.75.', '207.32.79.', '207.32.78.', '207.32.80.', '207.32.82.', '207.32.83.', '207.32.84.', '207.32.85.', '207.32.86.', '207.32.81.', '207.32.87.', '207.32.88.', '207.32.89.', '207.32.91.', '207.32.90.', '207.32.93.', '207.32.95.', '207.32.92.', '207.32.94.', '207.32.96.', '207.32.98.', '207.32.99.', '207.32.100.', '207.32.97.', '207.32.101.', '207.32.103.', '207.32.104.', '207.32.106.', '207.32.102.', '207.32.105.', '207.32.107.', '207.32.109.', '207.32.108.', '207.32.110.', '207.32.113.', '207.32.112.', '207.32.114.', '207.32.117.', '207.32.111.', '207.32.116.', '207.32.118.', '207.32.115.', '207.32.121.', '207.32.122.', '207.32.123.', '207.32.120.', '207.32.119.', '207.32.126.', '207.32.125.', '207.32.124.', '207.33.0.', '207.32.127.', '207.33.1.', '207.33.3.', '207.33.2.', '207.33.4.', '207.33.5.', '207.33.7.', '207.33.6.', '207.33.8.', '207.33.9.', '207.33.10.', '207.33.12.', '207.33.13.', '207.33.15.', '207.33.14.', '207.33.17.', '207.33.11.', '207.33.18.', '207.33.16.', '207.33.20.', '207.33.21.', '207.33.22.', '207.33.24.', '207.33.19.', '207.33.23.', '207.33.26.', '207.33.27.', '207.33.28.', '207.33.29.', '207.33.31.', '207.33.25.', '207.33.32.', '207.33.30.', '207.33.35.', '207.33.34.', '207.33.33.', '207.33.37.', '207.33.36.', '207.33.38.', '207.33.40.', '207.33.39.', '207.33.42.', '207.33.41.', '207.33.44.', '207.33.45.', '207.33.46.', '207.33.43.', '207.33.48.', '207.33.47.', '207.33.51.', '207.33.50.', '207.33.49.', '207.33.54.', '207.33.53.', '207.33.52.', '207.33.56.', '207.33.57.', '207.33.59.', '207.33.55.', '207.33.61.', '207.33.60.', '207.33.58.', '207.33.63.', '207.33.62.', '207.33.65.', '207.33.66.', '207.33.64.', '207.33.67.', '207.33.68.', '207.33.69.', '207.33.70.', '207.33.72.', '207.33.73.', '207.33.74.', '207.33.71.', '207.33.75.', '207.33.76.', '207.33.77.', '207.33.80.', '207.33.81.', '207.33.79.', '207.33.78.', '207.33.83.', '207.33.82.', '207.33.84.', '207.33.87.', '207.33.85.', '207.33.89.', '207.33.88.', '207.33.92.', '207.33.90.', '207.33.93.', '207.33.91.', '207.33.86.', '207.33.96.', '207.33.95.', '207.33.98.', '207.33.94.', '207.33.100.', '207.33.97.', '207.33.102.', '207.33.101.', '207.33.99.', '207.33.103.', '207.33.104.', '207.33.105.', '207.33.107.', '207.33.108.', '207.33.109.', '207.33.106.', '207.33.112.', '207.33.111.', '207.33.114.', '207.33.113.', '207.33.110.', '207.33.116.', '207.33.118.', '207.33.117.', '207.33.119.', '207.33.120.', '207.33.121.', '207.33.123.', '207.33.115.', '207.33.124.', '207.33.122.', '207.33.126.', '207.33.127.', '207.33.125.', '207.33.129.', '207.33.130.', '207.33.128.', '207.33.134.', '207.33.131.', '207.33.132.', '207.33.135.', '207.33.136.', '207.33.137.', '207.33.138.', '207.33.133.', '207.33.141.', '207.33.142.', '207.33.139.', '207.33.143.', '207.33.145.', '207.33.144.', '207.33.140.', '207.33.148.', '207.33.146.', '207.33.150.', '207.33.149.', '207.33.147.', '207.33.151.', '207.33.153.', '207.33.152.', '207.33.155.', '207.33.156.', '207.33.154.', '207.33.157.', '207.33.159.', '207.33.158.', '207.33.160.', '207.33.162.', '207.33.163.', '207.33.161.', '207.33.165.', '207.33.164.', '207.33.167.', '207.33.168.', '207.33.169.', '207.33.166.', '207.33.171.', '207.33.170.', '207.33.172.', '207.33.173.', '207.33.175.', '207.33.174.', '207.33.176.', '207.33.177.', '207.33.178.', '207.33.180.', '207.33.181.', '207.33.179.', '207.33.184.', '207.33.183.', '207.33.182.', '207.33.185.', '207.33.186.', '207.33.187.', '207.33.188.', '207.33.190.', '207.33.192.', '207.33.189.', '207.33.194.', '207.33.193.', '207.33.195.', '207.33.191.', '207.33.198.', '207.33.196.', '207.33.200.', '207.33.199.', '207.33.197.', '207.33.202.', '207.33.201.', '207.33.203.', '207.33.204.', '207.33.205.', '207.33.206.', '207.33.207.', '207.33.208.', '207.33.209.', '207.33.210.', '207.33.211.', '207.33.212.', '207.33.213.', '207.33.214.', '207.33.215.', '207.33.216.', '207.33.217.', '207.33.219.', '207.33.218.', '207.33.220.', '207.33.221.', '207.33.222.', '207.33.223.', '207.33.224.', '207.33.225.', '207.33.226.', '207.33.227.', '207.33.228.', '207.33.229.', '207.33.230.', '207.33.232.', '207.33.231.', '207.33.233.', '207.33.234.', '207.33.235.', '207.33.236.', '207.33.237.', '207.33.238.', '207.33.239.', '207.33.241.', '207.33.240.', '207.33.242.', '207.33.243.', '207.33.245.', '207.33.244.', '207.33.246.', '207.33.247.', '207.33.248.', '207.33.249.', '207.33.250.', '207.33.252.', '207.33.254.', '207.33.255.', '207.33.251.', '207.22.64.', '207.22.65.', '207.33.253.', '207.22.66.', '207.22.67.', '207.22.68.', '207.22.70.', '207.22.69.', '207.22.71.', '207.22.74.', '207.22.73.', '207.22.72.', '207.22.76.', '207.22.75.', '207.22.77.', '207.22.78.', '207.22.80.', '207.22.79.', '207.22.81.', '207.22.82.', '207.22.83.', '207.22.84.', '207.22.85.', '207.22.86.', '207.22.88.', '207.22.87.', '207.22.89.', '207.22.90.', '207.22.91.', '207.22.93.', '207.22.94.', '207.22.92.', '207.22.95.', '207.22.96.', '207.22.97.', '207.22.99.', '207.22.98.', '207.22.100.', '207.22.101.', '207.22.102.', '207.22.103.', '207.22.104.', '207.22.105.', '207.22.106.', '207.22.107.', '207.22.108.', '207.22.110.', '207.22.112.', '207.22.109.', '207.22.113.', '207.22.114.', '207.22.111.', '207.22.115.', '207.22.116.', '207.22.117.', '207.22.118.', '207.22.119.', '207.22.120.', '207.22.121.', '207.22.124.', '207.22.122.', '207.22.123.', '207.22.125.', '207.22.126.', '207.22.127.', '207.67.129.', '207.67.128.', '207.67.130.', '207.67.131.', '207.67.132.', '207.67.133.', '207.67.134.', '207.67.135.', '207.67.136.', '207.67.137.', '207.67.139.', '207.67.138.', '207.67.140.', '207.67.141.', '207.67.142.', '207.67.143.', '207.67.145.', '207.67.146.', '207.67.144.', '207.67.147.', '207.67.149.', '207.67.148.', '207.67.151.', '207.67.150.', '207.67.152.', '207.67.154.', '207.67.155.', '207.67.158.', '207.67.157.', '207.67.156.', '207.67.159.', '207.67.161.', '207.67.160.', '207.67.163.', '207.67.164.', '207.67.165.', '207.67.162.', '207.67.166.', '207.67.167.', '207.67.169.', '207.67.168.', '207.67.171.', '207.67.170.', '207.67.172.', '207.67.173.', '207.67.174.', '207.67.175.', '207.67.176.', '207.67.177.', '207.67.178.', '207.67.179.', '207.67.180.', '207.67.181.', '207.67.182.', '207.67.183.', '207.67.184.', '207.67.185.', '207.67.186.', '207.67.187.', '207.67.188.', '207.67.189.', '207.67.190.', '207.67.192.', '207.67.191.', '207.67.193.', '207.67.195.', '207.67.194.', '207.67.196.', '207.67.197.', '207.67.199.', '207.67.153.', '207.67.200.', '207.67.201.', '207.67.202.', '207.67.203.', '207.67.205.', '207.67.204.', '207.67.206.', '207.67.208.', '207.67.207.', '207.67.209.', '207.67.210.', '207.67.211.', '207.67.212.', '207.67.213.', '207.67.214.', '207.67.215.', '207.67.216.', '207.67.217.', '207.67.218.', '207.67.219.', '207.67.220.', '207.67.221.', '207.67.222.', '207.67.223.', '207.67.224.', '207.67.225.', '207.67.226.', '207.67.227.', '207.67.228.', '207.67.229.', '207.67.230.', '207.67.231.', '207.67.232.', '207.67.233.', '207.67.235.', '207.67.234.', '207.67.236.', '207.67.237.', '207.67.238.', '207.67.240.', '207.67.239.', '207.67.242.', '207.67.241.', '207.67.244.', '207.67.243.', '207.67.245.', '207.67.246.', '207.67.247.', '207.67.248.', '207.67.249.', '207.67.250.', '207.67.251.', '207.67.198.', '207.67.253.', '207.67.254.', '207.67.255.', '207.31.193.', '207.31.192.', '207.31.194.', '207.31.195.', '207.31.196.', '207.31.197.', '207.31.198.', '207.31.199.', '207.31.200.', '207.31.201.', '207.31.202.', '207.31.203.', '207.31.204.', '207.31.205.', '207.67.252.', '207.31.207.', '207.31.208.', '207.31.209.', '207.31.210.', '207.31.211.', '207.31.212.', '207.31.213.', '207.31.215.', '207.31.214.', '207.31.216.', '207.31.217.', '207.31.218.', '207.31.219.', '207.31.220.', '207.31.221.', '207.31.222.', '207.31.223.', '207.31.224.', '207.31.225.', '207.31.226.', '207.31.227.', '207.31.228.', '207.31.229.', '207.31.230.', '207.31.231.', '207.31.233.', '207.31.232.', '207.31.234.', '207.31.236.', '207.31.206.', '207.31.237.', '207.31.238.', '207.31.239.', '207.31.241.', '207.31.235.', '207.31.242.', '207.31.244.', '207.31.240.', '207.31.246.', '207.31.245.', '207.31.243.', '207.31.248.', '207.31.247.', '207.31.249.', '207.31.252.', '207.31.250.', '207.31.251.', '207.31.254.', '207.31.255.', '207.31.253.', '207.154.240.', '207.154.241.', '207.154.243.', '207.154.242.', '207.154.244.', '207.154.245.', '207.154.247.', '207.154.246.', '207.154.248.', '207.154.249.', '207.154.251.', '207.154.250.', '207.154.252.', '207.154.255.', '207.111.64.', '207.154.253.', '207.111.66.', '207.154.254.', '207.111.65.', '207.111.68.', '207.111.69.', '207.111.67.', '207.111.71.', '207.111.70.', '207.111.72.', '207.111.73.', '207.111.75.', '207.111.74.', '207.111.76.', '207.111.78.', '207.111.77.', '207.111.79.', '207.111.80.', '207.111.81.', '207.111.83.', '207.111.82.', '207.111.84.', '207.111.85.', '207.111.86.', '207.111.87.', '207.111.88.', '207.111.89.', '207.111.90.', '207.111.91.', '207.111.92.', '207.111.93.', '207.111.94.', '207.111.95.', '207.111.96.', '207.111.97.', '207.111.98.', '207.111.99.', '207.111.101.', '207.111.100.', '207.111.102.', '207.111.103.', '207.111.104.', '207.111.105.', '207.111.106.', '207.111.107.', '207.111.108.', '207.111.109.', '207.111.110.', '207.111.111.', '207.111.112.', '207.111.113.', '207.111.114.', '207.111.115.', '207.111.116.', '207.111.117.', '207.111.118.', '207.111.121.', '207.111.119.', '207.111.120.', '207.111.122.', '207.111.123.', '207.111.124.', '207.111.125.', '207.111.126.', '207.111.127.', '207.153.128.', '207.153.129.', '207.153.130.', '207.153.131.', '207.153.132.', '207.153.133.', '207.153.134.', '207.153.135.', '207.153.136.', '207.153.137.', '207.153.138.', '207.153.139.', '207.153.140.', '207.153.142.', '207.153.143.', '207.153.141.', '207.153.144.', '207.153.145.', '207.153.146.', '207.153.147.', '207.153.148.', '207.153.149.', '207.153.150.', '207.153.151.', '207.153.152.', '207.153.153.', '207.153.154.', '207.153.155.', '207.153.156.', '207.153.157.', '207.153.158.', '207.153.159.', '207.153.161.', '207.153.160.', '207.153.162.', '207.153.163.', '207.153.164.', '207.153.165.', '207.153.166.', '207.153.167.', '207.153.168.', '207.153.169.', '207.153.170.', '207.153.171.', '207.153.172.', '207.153.173.', '207.153.174.', '207.153.175.', '207.153.176.', '207.153.177.', '207.153.178.', '207.153.179.', '207.153.180.', '207.153.182.', '207.153.181.', '207.153.183.', '207.153.184.', '207.153.185.', '207.153.186.', '207.153.187.', '207.153.188.', '207.153.190.', '207.153.189.', '207.153.191.', '207.153.192.', '207.153.193.', '207.153.194.', '207.153.195.', '207.153.196.', '207.153.197.', '207.153.199.', '207.153.198.', '207.153.200.', '207.153.201.', '207.153.202.', '207.153.203.', '207.153.204.', '207.153.205.', '207.153.206.', '207.153.207.', '207.153.208.', '207.153.209.', '207.153.210.', '207.153.211.', '207.153.212.', '207.153.213.', '207.153.214.', '207.153.215.', '207.153.217.', '207.153.216.', '207.153.218.', '207.153.219.', '207.153.220.', '207.153.221.', '207.153.222.', '207.153.224.', '207.153.223.', '207.153.225.', '207.153.226.', '207.153.227.', '207.153.228.', '207.153.229.', '207.153.230.', '207.153.231.', '207.153.232.', '207.153.233.', '207.153.234.', '207.153.235.', '207.153.236.', '207.153.238.', '207.153.237.', '207.153.239.', '207.153.240.', '207.153.241.', '207.153.242.', '207.153.243.', '207.153.245.', '207.153.244.', '207.153.247.', '207.153.246.', '207.153.248.', '207.153.249.', '207.153.250.', '207.153.251.', '207.153.252.', '207.153.253.', '207.153.254.', '207.153.255.', '207.152.64.', '207.152.65.', '207.152.66.', '207.152.67.', '207.152.68.', '207.152.69.', '207.152.70.', '207.152.71.', '207.152.72.', '207.152.73.', '207.152.74.', '207.152.76.', '207.152.75.', '207.152.77.', '207.152.78.', '207.152.79.', '207.152.80.', '207.152.81.', '207.152.82.', '207.152.83.', '207.152.84.', '207.152.85.', '207.152.86.', '207.152.88.', '207.152.87.', '207.152.89.', '207.152.90.', '207.152.91.', '207.152.93.', '207.152.92.', '207.152.94.', '207.152.95.', '207.152.96.', '207.152.97.', '207.152.98.', '207.152.99.', '207.152.100.', '207.152.101.', '207.152.102.', '207.152.103.', '207.152.104.', '207.152.105.', '207.152.107.', '207.152.106.', '207.152.108.', '207.152.109.', '207.152.110.', '207.152.111.', '207.152.112.', '207.152.113.', '207.152.115.', '207.152.114.', '207.152.117.', '207.152.116.', '207.152.119.', '207.152.120.', '207.152.121.', '207.152.123.', '207.152.118.', '207.152.122.', '207.152.124.', '207.152.125.', '207.152.127.', '207.152.126.', '207.154.208.', '207.154.211.', '207.154.210.', '207.154.212.', '207.154.213.', '207.154.209.', '207.154.214.', '207.154.215.', '207.154.216.', '207.154.217.', '207.154.218.', '207.154.219.', '207.154.221.', '207.154.220.', '207.154.223.', '207.154.222.', '207.58.1.', '207.58.0.', '207.58.2.', '207.58.3.', '207.58.4.', '207.58.6.', '207.58.5.', '207.58.7.', '207.58.8.', '207.58.9.', '207.58.10.', '207.58.11.', '207.58.12.', '207.58.13.', '207.58.14.', '207.58.15.', '207.58.16.', '207.58.17.', '207.58.18.', '207.58.19.', '207.58.20.', '207.58.21.', '207.58.22.', '207.58.23.', '207.58.25.', '207.58.27.', '207.58.26.', '207.58.28.', '207.58.29.', '207.58.30.', '207.58.31.', '207.58.32.', '207.58.24.', '207.58.33.', '207.58.34.', '207.58.35.', '207.58.36.', '207.58.37.', '207.58.38.', '207.58.39.', '207.58.40.', '207.58.41.', '207.58.42.', '207.58.43.', '207.58.44.', '207.58.45.', '207.58.46.', '207.58.47.', '207.58.48.', '207.58.49.', '207.58.50.', '207.58.51.', '207.58.52.', '207.58.53.', '207.58.54.', '207.58.55.', '207.58.56.', '207.58.57.', '207.58.58.', '207.58.59.', '207.58.61.', '207.58.60.', '207.58.62.', '207.58.63.', '207.58.64.', '207.58.65.', '207.58.66.', '207.58.67.', '207.58.69.', '207.58.68.', '207.58.70.', '207.58.71.', '207.58.73.', '207.58.74.', '207.58.75.', '207.58.72.', '207.58.77.', '207.58.76.', '207.58.78.', '207.58.79.', '207.58.80.', '207.58.81.', '207.58.82.', '207.58.83.', '207.58.85.', '207.58.86.', '207.58.84.', '207.58.87.', '207.58.88.', '207.58.89.', '207.58.90.', '207.58.91.', '207.58.92.', '207.58.93.', '207.58.94.', '207.58.95.', '207.58.97.', '207.58.98.', '207.58.96.', '207.58.99.', '207.58.100.', '207.58.101.', '207.58.102.', '207.58.103.', '207.58.104.', '207.58.106.', '207.58.105.', '207.58.107.', '207.58.108.', '207.58.109.', '207.58.111.', '207.58.110.', '207.58.112.', '207.58.113.', '207.58.114.', '207.58.115.', '207.58.116.', '207.58.117.', '207.58.118.', '207.58.119.', '207.58.120.', '207.58.121.', '207.58.122.', '207.58.123.', '207.58.124.', '207.58.125.', '207.58.127.', '207.58.126.', '207.55.192.', '207.55.193.', '207.55.194.', '207.55.195.', '207.55.196.', '207.55.197.', '207.55.198.', '207.55.199.', '207.55.200.', '207.55.201.', '207.55.202.', '207.55.203.', '207.55.204.', '207.55.205.', '207.55.206.', '207.55.207.', '207.55.208.', '207.55.209.', '207.55.210.', '207.55.211.', '207.55.213.', '207.55.212.', '207.55.214.', '207.55.215.', '207.55.216.', '207.55.217.', '207.55.218.', '207.55.219.', '207.55.221.', '207.55.220.', '207.55.222.', '207.55.223.', '206.239.1.', '206.239.2.', '206.239.0.', '206.239.3.', '206.239.4.', '206.239.5.', '206.239.6.', '206.239.7.', '206.239.8.', '206.239.9.', '206.239.11.', '206.239.10.', '206.239.12.', '206.239.13.', '206.239.14.', '206.239.15.', '206.239.16.', '206.239.18.', '206.239.19.', '206.239.20.', '206.239.17.', '206.239.21.', '206.239.22.', '206.239.24.', '206.239.23.', '206.239.25.', '206.239.26.', '206.239.27.', '206.239.28.', '206.239.29.', '206.239.30.', '206.239.31.', '206.239.32.', '206.239.33.', '206.239.34.', '206.239.35.', '206.239.36.', '206.239.37.', '206.239.38.', '206.239.39.', '206.239.40.', '206.239.41.', '206.239.42.', '206.239.43.', '206.239.44.', '206.239.45.', '206.239.46.', '206.239.47.', '206.239.48.', '206.239.49.', '206.239.50.', '206.239.51.', '206.239.52.', '206.239.53.', '206.239.54.', '206.239.56.', '206.239.55.', '206.239.57.', '206.239.58.', '206.239.60.', '206.239.59.', '206.239.61.', '206.239.62.', '206.239.63.', '206.239.64.', '206.239.65.', '206.239.66.', '206.239.67.', '206.239.68.', '206.239.69.', '206.239.70.', '206.239.71.', '206.239.72.', '206.239.73.', '206.239.74.', '206.239.75.', '206.239.76.', '206.239.77.', '206.239.78.', '206.239.79.', '206.239.80.', '206.239.81.', '206.239.82.', '206.239.83.', '206.239.84.', '206.239.85.', '206.239.86.', '206.239.89.', '206.239.87.', '206.239.88.', '206.239.90.', '206.239.91.', '206.239.93.', '206.239.92.', '206.239.94.', '206.239.96.', '206.239.97.', '206.239.95.', '206.239.98.', '206.239.100.', '206.239.101.', '206.239.99.', '206.239.102.', '206.239.104.', '206.239.103.', '206.239.107.', '206.239.106.', '206.239.105.', '206.239.109.', '206.239.108.', '206.239.112.', '206.239.110.', '206.239.113.', '206.239.111.', '206.239.115.', '206.239.116.', '206.239.118.', '206.239.117.', '206.239.119.', '206.239.120.', '206.239.114.', '206.239.122.', '206.239.121.', '206.239.123.', '206.239.124.', '206.239.126.', '206.239.125.', '206.239.127.', '206.239.128.', '206.239.129.', '206.239.130.', '206.239.131.', '206.239.132.', '206.239.133.', '206.239.134.', '206.239.135.', '206.239.136.', '206.239.137.', '206.239.138.', '206.239.139.', '206.239.140.', '206.239.141.', '206.239.142.', '206.239.143.', '206.239.144.', '206.239.145.', '206.239.146.', '206.239.148.', '206.239.147.', '206.239.149.', '206.239.150.', '206.239.151.', '206.239.153.', '206.239.152.', '206.239.154.', '206.239.156.', '206.239.155.', '206.239.157.', '206.239.158.', '206.239.159.', '206.239.160.', '206.239.161.', '206.239.162.', '206.239.163.', '206.239.164.', '206.239.165.', '206.239.167.', '206.239.166.', '206.239.168.', '206.239.169.', '206.239.170.', '206.239.171.', '206.239.172.', '206.239.173.', '206.239.174.', '206.239.176.', '206.239.175.', '206.239.177.', '206.239.178.', '206.239.179.', '206.239.181.', '206.239.180.', '206.239.182.', '206.239.183.', '206.239.184.', '206.239.185.', '206.239.186.', '206.239.187.', '206.239.188.', '206.239.190.', '206.239.189.', '206.239.191.', '206.239.192.', '206.239.193.', '206.239.194.', '206.239.195.', '206.239.196.', '206.239.198.', '206.239.197.', '206.239.199.', '206.239.200.', '206.239.201.', '206.239.202.', '206.239.203.', '206.239.204.', '206.239.205.', '206.239.206.', '206.239.207.', '206.239.208.', '206.239.209.', '206.239.210.', '206.239.212.', '206.239.211.', '206.239.213.', '206.239.214.', '206.239.215.', '206.239.216.', '206.239.217.', '206.239.218.', '206.239.219.', '206.239.220.', '206.239.221.', '206.239.222.', '206.239.223.', '206.239.224.', '206.239.225.', '206.239.226.', '206.239.227.', '206.239.228.', '206.239.229.', '206.239.230.', '206.239.231.', '206.239.232.', '206.239.233.', '206.239.234.', '206.239.235.', '206.239.236.', '206.239.237.', '206.239.238.', '206.239.239.', '206.239.240.', '206.239.241.', '206.239.242.', '206.239.243.', '206.239.244.', '206.239.245.', '206.239.246.', '206.239.247.', '206.239.248.', '206.239.250.', '206.239.249.', '206.239.251.', '206.239.252.', '206.239.253.', '206.239.254.', '206.239.255.', '207.91.64.', '207.91.65.', '207.91.66.', '207.91.67.', '207.91.68.', '207.91.69.', '207.91.70.', '207.91.71.', '207.91.72.', '207.91.74.', '207.91.73.', '207.91.75.', '207.91.76.', '207.91.78.', '207.91.77.', '207.91.79.', '207.91.80.', '207.91.81.', '207.91.83.', '207.91.82.', '207.91.84.', '207.91.87.', '207.91.89.', '207.91.90.', '207.91.88.', '207.91.85.', '207.91.91.', '207.91.92.', '207.91.94.', '207.91.95.', '207.91.93.', '207.91.96.', '207.91.97.', '207.91.98.', '207.91.86.', '207.91.99.', '207.91.100.', '207.91.101.', '207.91.102.', '207.91.103.', '207.91.104.', '207.91.105.', '207.91.106.', '207.91.107.', '207.91.109.', '207.91.110.', '207.91.108.', '207.91.111.', '207.91.112.', '207.91.113.', '207.91.114.', '207.91.115.', '207.91.117.', '207.91.116.', '207.91.118.', '207.91.119.', '207.91.120.', '207.91.121.', '207.91.122.', '207.91.123.', '207.91.124.', '207.91.125.', '207.91.126.', '207.91.127.', '207.171.20.', '207.171.25.', '207.154.192.', '207.154.193.', '207.154.194.', '207.154.195.', '207.154.196.', '207.154.199.', '207.154.197.', '207.154.200.', '207.154.198.', '207.154.202.', '207.154.203.', '207.154.201.', '207.154.205.', '207.154.206.', '207.154.207.', '207.154.204.', '207.154.225.', '207.154.226.', '207.154.227.', '207.154.224.', '207.154.230.', '207.154.228.', '207.154.231.', '207.154.232.', '207.154.233.', '207.154.235.', '207.154.236.', '207.154.229.', '207.154.234.', '207.154.237.', '207.154.238.', '207.154.239.', '207.171.21.', '207.21.1.', '207.171.19.', '207.21.2.', '207.21.4.', '207.21.3.', '207.21.5.', '207.21.6.', '207.21.7.', '207.21.0.', '207.21.8.', '207.21.11.', '207.21.9.', '207.21.10.', '207.21.13.', '207.21.15.', '207.21.14.', '207.21.12.', '207.21.16.', '207.21.17.', '207.21.20.', '207.21.18.', '207.21.21.', '207.21.22.', '207.21.23.', '207.21.24.', '207.21.26.', '207.21.27.', '207.21.28.', '207.21.29.', '207.21.30.', '207.21.19.', '207.21.31.', '207.21.32.', '207.21.33.', '207.21.25.', '207.21.35.', '207.21.34.', '207.21.36.', '207.21.38.', '207.21.37.', '207.21.39.', '207.21.40.', '207.21.43.', '207.21.45.', '207.21.42.', '207.21.41.', '207.21.46.', '207.21.44.', '207.21.49.', '207.21.47.', '207.21.51.', '207.21.52.', '207.21.53.', '207.21.48.', '207.21.54.', '207.21.55.', '207.21.56.', '207.21.57.', '207.21.59.', '207.21.50.', '207.21.61.', '207.21.60.', '207.21.58.', '207.21.63.', '207.21.64.', '207.21.65.', '207.21.66.', '207.21.62.', '207.21.68.', '207.21.67.', '207.21.69.', '207.21.70.', '207.21.72.', '207.21.73.', '207.21.74.', '207.21.76.', '207.21.71.', '207.21.77.', '207.21.75.', '207.21.79.', '207.21.78.', '207.21.80.', '207.21.81.', '207.21.82.', '207.21.84.', '207.21.86.', '207.21.83.', '207.21.85.', '207.21.88.', '207.21.89.', '207.21.87.', '207.21.91.', '207.21.92.', '207.21.90.', '207.21.93.', '207.21.95.', '207.21.94.', '207.21.96.', '207.21.97.', '207.21.99.', '207.21.100.', '207.21.101.', '207.21.98.', '207.21.102.', '207.21.104.', '207.21.105.', '207.21.103.', '207.21.108.', '207.21.107.', '207.21.109.', '207.21.106.', '207.21.111.', '207.21.110.', '207.21.112.', '207.21.116.', '207.21.113.', '207.21.115.', '207.21.117.', '207.21.119.', '207.21.114.', '207.21.121.', '207.21.118.', '207.21.120.', '207.21.123.', '207.21.122.', '207.21.126.', '207.21.124.', '207.159.0.', '207.21.127.', '207.159.1.', '207.21.125.', '207.159.3.', '207.159.4.', '207.159.5.', '207.159.6.', '207.159.7.', '207.159.8.', '207.159.9.', '207.159.11.', '207.159.2.', '207.159.12.', '207.159.10.', '207.159.14.', '207.159.15.', '207.159.13.', '207.159.18.', '207.159.17.', '207.159.16.', '207.159.20.', '207.159.19.', '207.159.22.', '207.159.23.', '207.159.21.', '207.159.26.', '207.159.27.', '207.159.25.', '207.159.24.', '207.159.29.', '207.159.30.', '207.159.28.', '207.159.31.', '207.159.32.', '207.159.34.', '207.159.33.', '207.159.36.', '207.159.38.', '207.159.35.', '207.159.37.', '207.159.40.', '207.159.39.', '207.159.42.', '207.159.44.', '207.159.43.', '207.159.45.', '207.159.46.', '207.159.41.', '207.159.47.', '207.159.49.', '207.159.48.', '207.159.50.', '207.159.51.', '207.159.52.', '207.159.53.', '207.159.54.', '207.159.55.', '207.159.56.', '207.159.57.', '207.159.58.', '207.159.59.', '207.159.60.', '207.159.61.', '207.159.62.', '207.159.63.', '207.171.17.', '207.156.129.', '207.156.128.', '207.156.130.', '207.156.131.', '207.156.133.', '207.156.132.', '207.156.135.', '207.156.134.', '207.156.136.', '207.156.138.', '207.156.137.', '207.156.139.', '207.156.140.', '207.156.141.', '207.156.142.', '207.156.143.', '207.156.144.', '207.156.145.', '207.156.146.', '207.156.147.', '207.156.148.', '207.156.149.', '207.156.150.', '207.156.152.', '207.156.151.', '207.156.153.', '207.156.156.', '207.156.154.', '207.156.155.', '207.156.157.', '207.156.159.', '207.156.158.', '207.156.160.', '207.156.161.', '207.156.162.', '207.156.163.', '207.156.164.', '207.156.165.', '207.156.166.', '207.156.167.', '207.156.169.', '207.156.168.', '207.156.170.', '207.156.171.', '207.156.172.', '207.156.173.', '207.156.174.', '207.156.175.', '207.156.176.', '207.156.177.', '207.156.178.', '207.156.179.', '207.156.180.', '207.156.181.', '207.156.182.', '207.156.183.', '207.156.184.', '207.156.186.', '207.156.187.', '207.156.185.', '207.156.188.', '207.156.190.', '207.156.191.', '207.156.189.', '207.156.192.', '207.156.193.', '207.156.195.', '207.156.194.', '207.156.196.', '207.156.197.', '207.156.198.', '207.156.199.', '207.156.200.', '207.156.201.', '207.156.202.', '207.156.203.', '207.156.205.', '207.156.204.', '207.156.206.', '207.156.207.', '207.156.209.', '207.156.208.', '207.156.210.', '207.156.211.', '207.156.213.', '207.156.212.', '207.156.214.', '207.156.215.', '207.156.216.', '207.156.217.', '207.156.218.', '207.156.219.', '207.156.221.', '207.156.220.', '207.156.224.', '207.156.222.', '207.156.223.', '207.156.225.', '207.156.227.', '207.156.228.', '207.156.230.', '207.156.226.', '207.156.229.', '207.156.233.', '207.156.234.', '207.156.232.', '207.156.231.', '207.156.235.', '207.156.238.', '207.156.236.', '207.156.241.', '207.156.237.', '207.156.240.', '207.156.242.', '207.156.243.', '207.156.244.', '207.156.239.', '207.156.247.', '207.156.246.', '207.156.245.', '207.156.249.', '207.156.250.', '207.156.251.', '207.156.252.', '207.156.248.', '207.156.254.', '207.156.253.', '207.197.129.', '207.197.128.', '207.197.131.', '207.156.255.', '207.197.130.', '207.197.133.', '207.197.132.', '207.197.135.', '207.197.134.', '207.197.136.', '207.197.137.', '207.197.138.', '207.197.139.', '207.197.140.', '207.197.141.', '207.197.142.', '207.197.144.', '207.197.143.', '207.197.145.', '207.197.146.', '207.197.147.', '207.197.148.', '207.197.149.', '207.197.150.', '207.197.151.', '207.197.152.', '207.197.153.', '207.197.154.', '207.197.155.', '207.197.156.', '207.197.158.', '207.197.157.', '207.197.159.', '207.197.160.', '207.197.161.', '207.197.162.', '207.197.163.', '207.197.164.', '207.197.166.', '207.197.165.', '207.197.167.', '207.197.168.', '207.197.169.', '207.197.170.', '207.197.171.', '207.197.172.', '207.197.174.', '207.197.173.', '207.197.175.', '207.197.176.', '207.197.177.', '207.197.178.', '207.197.179.', '207.197.180.', '207.197.181.', '207.197.182.', '207.197.183.', '207.197.184.', '207.197.185.', '207.197.186.', '207.197.188.', '207.197.187.', '207.197.189.', '207.197.190.', '207.197.191.', '207.197.192.', '207.197.193.', '207.197.194.', '207.197.195.', '207.197.196.', '207.197.197.', '207.197.198.', '207.197.199.', '207.197.200.', '207.197.201.', '207.197.202.', '207.197.203.', '207.197.204.', '207.197.206.', '207.197.205.', '207.197.207.', '207.197.208.', '207.197.209.', '207.197.210.', '207.197.212.', '207.197.211.', '207.197.214.', '207.197.213.', '207.197.215.', '207.197.216.', '207.197.217.', '207.197.218.', '207.197.219.', '207.197.221.', '207.197.220.', '207.197.222.', '207.197.223.', '207.197.224.', '207.197.225.', '207.197.226.', '207.197.227.', '207.197.228.', '207.197.230.', '207.197.229.', '207.197.231.', '207.197.232.', '207.197.234.', '207.197.233.', '207.197.235.', '207.197.236.', '207.197.238.', '207.197.237.', '207.197.239.', '207.197.241.', '207.197.240.', '207.197.242.', '207.197.243.', '207.197.244.', '207.197.245.', '207.197.247.', '207.197.246.', '207.197.248.', '207.197.249.', '207.197.250.', '207.197.251.', '207.197.252.', '207.197.253.', '207.197.254.', '207.197.255.', '207.171.23.', '208.123.223.', '207.171.22.', '207.199.0.', '207.199.2.', '207.199.1.', '207.199.3.', '207.199.4.', '207.199.5.', '207.199.6.', '207.199.7.', '207.199.8.', '207.199.9.', '207.199.11.', '207.199.10.', '207.199.12.', '207.199.13.', '207.199.14.', '207.199.15.', '207.199.16.', '207.199.17.', '207.199.18.', '207.199.19.', '207.199.20.', '207.199.21.', '207.199.22.', '207.199.23.', '207.199.24.', '207.199.25.', '207.199.26.', '207.199.27.', '207.199.28.', '207.199.29.', '207.199.30.', '207.199.31.', '207.199.32.', '207.199.33.', '207.199.35.', '207.199.34.', '207.199.36.', '207.199.37.', '207.199.38.', '207.199.39.', '207.199.41.', '207.199.40.', '207.199.42.', '207.199.43.', '207.199.44.', '207.199.45.', '207.199.46.', '207.199.47.', '207.199.48.', '207.199.49.', '207.199.50.', '207.199.51.', '207.199.52.', '207.199.53.', '207.199.54.', '207.199.55.', '207.199.56.', '207.199.57.', '207.199.58.', '207.199.59.', '207.199.60.', '207.199.61.', '207.199.62.', '207.199.63.', '207.199.64.', '207.199.65.', '207.199.66.', '207.199.67.', '207.199.68.', '207.199.69.', '207.199.70.', '207.199.71.', '207.199.72.', '207.199.73.', '207.199.74.', '207.199.75.', '207.199.76.', '207.199.77.', '207.199.78.', '207.199.79.', '207.199.80.', '207.199.81.', '207.199.82.', '207.199.83.', '207.199.84.', '207.199.85.', '207.199.86.', '207.199.88.', '207.199.87.', '207.199.89.', '207.199.90.', '207.199.91.', '207.199.92.', '207.199.93.', '207.199.94.', '207.199.95.', '207.199.96.', '207.199.97.', '207.199.98.', '207.199.100.', '207.199.99.', '207.199.101.', '207.199.102.', '207.199.104.', '207.199.103.', '207.199.105.', '207.199.106.', '207.199.107.', '207.199.108.', '207.199.109.', '207.199.110.', '207.199.112.', '207.199.111.', '207.199.113.', '207.199.114.', '207.199.116.', '207.199.115.', '207.199.117.', '207.199.118.', '207.199.119.', '207.199.120.', '207.199.121.', '207.199.122.', '207.199.123.', '207.199.124.', '207.199.125.', '207.199.126.', '207.199.127.', '207.241.1.', '207.241.0.', '207.241.2.', '207.241.3.', '207.241.4.', '207.241.5.', '207.241.7.', '207.241.6.', '207.241.8.', '207.241.9.', '207.241.10.', '207.241.11.', '207.241.12.', '207.241.13.', '207.241.14.', '207.241.16.', '207.241.17.', '207.241.15.', '207.241.18.', '207.241.19.', '207.241.20.', '207.241.21.', '207.241.22.', '207.241.23.', '207.241.24.', '207.241.25.', '207.241.26.', '207.241.27.', '207.241.28.', '207.241.29.', '207.241.30.', '207.241.31.', '207.241.32.', '207.241.33.', '207.241.34.', '207.241.35.', '207.241.36.', '207.241.37.', '207.241.38.', '207.241.39.', '207.241.41.', '207.241.40.', '207.241.42.', '207.241.43.', '207.241.44.', '207.241.45.', '207.241.46.', '207.241.47.', '207.241.48.', '207.241.49.', '207.241.51.', '207.241.50.', '207.241.52.', '207.241.53.', '207.241.54.', '207.241.55.', '207.241.56.', '207.241.57.', '207.241.59.', '207.241.58.', '207.241.60.', '207.241.61.', '207.241.62.', '207.241.63.', '207.241.64.', '207.241.65.', '207.241.66.', '207.241.67.', '207.241.68.', '207.241.69.', '207.241.70.', '207.241.71.', '207.241.72.', '207.241.73.', '207.241.74.', '207.241.75.', '207.241.77.', '207.241.76.', '207.241.78.', '207.241.79.', '207.241.80.', '207.241.81.', '207.241.83.', '207.241.82.', '207.241.84.', '207.241.85.', '207.241.87.', '207.241.86.', '207.241.88.', '207.241.89.', '207.241.90.', '207.241.91.', '207.241.92.', '207.241.93.', '207.241.95.', '207.241.94.', '207.241.96.', '207.241.97.', '207.241.98.', '207.241.99.', '207.241.100.', '207.241.101.', '207.241.102.', '207.241.103.', '207.241.104.', '207.241.105.', '207.241.106.', '207.241.107.', '207.241.108.', '207.241.109.', '207.241.110.', '207.241.111.', '207.241.112.', '207.241.113.', '207.241.114.', '207.241.115.', '207.241.116.', '207.241.118.', '207.241.117.', '207.241.119.', '207.241.120.', '207.241.121.', '207.241.122.', '207.241.123.', '207.241.124.', '207.241.125.', '207.241.127.', '207.241.126.', '207.171.27.', '207.207.128.', '207.207.129.', '207.207.130.', '207.207.132.', '207.207.131.', '207.207.133.', '207.207.134.', '207.207.135.', '207.207.136.', '207.207.137.', '207.207.138.', '207.207.139.', '207.207.140.', '207.207.141.', '207.207.142.', '207.207.144.', '207.207.143.', '207.207.145.', '207.207.146.', '207.207.147.', '207.207.148.', '207.207.149.', '207.207.150.', '207.207.151.', '207.207.152.', '207.207.153.', '207.207.154.', '207.207.155.', '207.207.156.', '207.207.157.', '207.207.158.', '207.207.159.', '207.171.30.', '207.206.0.', '207.206.2.', '207.206.3.', '207.206.1.', '207.206.4.', '207.206.6.', '207.206.5.', '207.206.7.', '207.206.8.', '207.206.9.', '207.206.11.', '207.206.10.', '207.206.12.', '207.206.13.', '207.206.15.', '207.206.14.', '207.206.16.', '207.206.17.', '207.206.20.', '207.206.19.', '207.206.18.', '207.206.21.', '207.206.22.', '207.206.23.', '207.206.24.', '207.206.25.', '207.206.26.', '207.206.27.', '207.206.28.', '207.206.29.', '207.206.30.', '207.206.31.', '207.206.32.', '207.206.33.', '207.206.34.', '207.206.35.', '207.206.36.', '207.206.37.', '207.206.38.', '207.206.39.', '207.206.40.', '207.206.41.', '207.206.42.', '207.206.43.', '207.206.44.', '207.206.45.', '207.206.46.', '207.206.47.', '207.206.48.', '207.206.49.', '207.206.50.', '207.206.51.', '207.206.52.', '207.206.53.', '207.206.54.', '207.206.55.', '207.206.56.', '207.206.57.', '207.206.58.', '207.206.59.', '207.206.60.', '207.206.62.', '207.206.61.', '207.206.63.', '207.206.66.', '207.206.64.', '207.206.65.', '207.206.67.', '207.206.68.', '207.206.69.', '207.206.70.', '207.206.71.', '207.206.72.', '207.206.74.', '207.206.73.', '207.206.75.', '207.206.78.', '207.206.77.', '207.206.76.', '207.206.79.', '207.206.81.', '207.206.82.', '207.206.83.', '207.206.80.', '207.206.84.', '207.206.85.', '207.206.87.', '207.206.86.', '207.206.88.', '207.206.89.', '207.206.90.', '207.206.91.', '207.206.92.', '207.206.93.', '207.206.94.', '207.206.95.', '207.206.96.', '207.206.97.', '207.206.99.', '207.206.98.', '207.206.100.', '207.206.101.', '207.206.102.', '207.206.103.', '207.206.104.', '207.206.105.', '207.206.106.', '207.206.107.', '207.206.108.', '207.206.109.', '207.206.110.', '207.206.111.', '207.206.112.', '207.206.114.', '207.206.113.', '207.206.115.', '207.206.116.', '207.206.117.', '207.206.118.', '207.206.119.', '207.206.120.', '207.206.121.', '207.206.122.', '207.206.123.', '207.206.124.', '207.206.125.', '207.206.126.', '207.206.127.', '209.57.1.', '209.57.0.', '209.57.2.', '209.57.3.', '209.57.4.', '209.57.5.', '209.57.6.', '209.57.7.', '209.57.8.', '209.57.10.', '209.57.9.', '209.57.11.', '209.57.12.', '209.57.13.', '209.57.14.', '209.57.15.', '209.57.16.', '209.57.17.', '209.57.18.', '209.57.19.', '209.57.20.', '209.57.21.', '209.57.22.', '209.57.23.', '209.57.24.', '209.57.25.', '209.57.26.', '209.57.27.', '209.57.28.', '209.57.29.', '209.57.30.', '209.57.31.', '209.57.33.', '209.57.32.', '209.57.34.', '209.57.35.', '209.57.36.', '209.57.37.', '209.57.38.', '209.57.39.', '209.57.41.', '209.57.40.', '209.57.42.', '209.57.43.', '209.57.45.', '209.57.44.', '209.57.46.', '209.57.47.', '209.57.48.', '209.57.49.', '209.57.50.', '209.57.51.', '209.57.52.', '209.57.53.', '209.57.54.', '209.57.55.', '209.57.56.', '209.57.57.', '209.57.58.', '209.57.59.', '209.57.60.', '209.57.61.', '209.57.62.', '209.57.63.', '209.57.64.', '209.57.66.', '209.57.65.', '209.57.67.', '209.57.68.', '209.57.70.', '209.57.69.', '209.57.71.', '209.57.72.', '209.57.73.', '209.57.75.', '209.57.74.', '209.57.76.', '209.57.77.', '209.57.78.', '209.57.79.', '209.57.80.', '209.57.81.', '209.57.82.', '209.57.84.', '209.57.85.', '209.57.83.', '209.57.86.', '209.57.87.', '209.57.88.', '209.57.89.', '209.57.90.', '209.57.91.', '209.57.92.', '209.57.93.', '209.57.94.', '209.57.95.', '209.57.96.', '209.57.97.', '209.57.98.', '209.57.99.', '209.57.101.', '209.57.100.', '209.57.102.', '209.57.103.', '209.57.104.', '209.57.105.', '209.57.107.', '209.57.106.', '209.57.108.', '209.57.109.', '209.57.110.', '209.57.111.', '209.57.112.', '209.57.113.', '209.57.114.', '209.57.115.', '209.57.116.', '209.57.117.', '209.57.118.', '209.57.120.', '209.57.119.', '209.57.121.', '209.57.122.', '209.57.123.', '209.57.125.', '209.57.124.', '209.57.127.', '209.57.126.', '209.57.128.', '209.57.129.', '209.57.130.', '209.57.131.', '209.57.132.', '209.57.133.', '209.57.134.', '209.57.135.', '209.57.136.', '209.57.137.', '209.57.138.', '209.57.139.', '209.57.140.', '209.57.141.', '209.57.142.', '209.57.143.', '209.57.144.', '209.57.145.', '209.57.146.', '209.57.147.', '209.57.148.', '209.57.149.', '209.57.150.', '209.57.151.', '209.57.152.', '209.57.153.', '209.57.154.', '209.57.156.', '209.57.155.', '209.57.157.', '209.57.158.', '209.57.159.', '209.57.161.', '209.57.162.', '209.57.160.', '209.57.163.', '209.57.164.', '209.57.166.', '209.57.165.', '209.57.167.', '209.57.168.', '209.57.170.', '209.57.169.', '209.57.171.', '209.57.172.', '209.57.173.', '209.57.174.', '209.57.175.', '209.57.176.', '209.57.177.', '209.57.178.', '209.57.179.', '209.57.180.', '209.57.181.', '209.57.182.', '209.57.183.', '209.57.184.', '209.57.185.', '209.57.186.', '209.57.187.', '209.57.188.', '209.57.189.', '209.57.190.', '209.57.191.', '209.57.192.', '209.57.193.', '209.57.194.', '209.57.195.', '209.57.196.', '209.57.197.', '209.57.198.', '209.57.199.', '209.57.200.', '209.57.201.', '209.57.202.', '209.57.203.', '209.57.204.', '209.57.205.', '209.57.206.', '209.57.207.', '209.57.208.', '209.57.209.', '209.57.210.', '209.57.211.', '209.57.212.', '209.57.213.', '209.57.214.', '209.57.215.', '209.57.216.', '209.57.217.', '209.57.218.', '209.57.219.', '209.57.220.', '209.57.221.', '209.57.222.', '209.57.223.', '209.57.224.', '209.57.225.', '209.57.228.', '209.57.226.', '209.57.227.', '209.57.229.', '209.57.230.', '209.57.231.', '209.57.232.', '209.57.233.', '209.57.234.', '209.57.235.', '209.57.236.', '209.57.237.', '209.57.238.', '209.57.239.', '209.57.241.', '209.57.240.', '209.57.242.', '209.57.243.', '209.57.244.', '209.57.245.', '209.57.246.', '209.57.247.', '209.57.248.', '209.57.249.', '209.57.250.', '209.57.251.', '209.57.252.', '209.57.253.', '209.57.254.', '209.57.255.', '207.171.15.', '207.198.128.', '207.198.129.', '207.198.130.', '207.198.131.', '207.198.132.', '207.198.133.', '207.198.135.', '207.198.134.', '207.198.136.', '207.198.137.', '207.198.138.', '207.198.139.', '207.198.140.', '207.198.141.', '207.198.142.', '207.198.143.', '207.198.145.', '207.198.144.', '207.198.146.', '207.198.147.', '207.198.149.', '207.198.148.', '207.198.150.', '207.198.151.', '207.198.152.', '207.198.153.', '207.198.154.', '207.198.155.', '207.198.156.', '207.198.157.', '207.198.158.', '207.198.159.', '207.198.160.', '207.198.161.', '207.198.162.', '207.198.163.', '207.198.164.', '207.198.165.', '207.198.166.', '207.198.167.', '207.198.169.', '207.198.168.', '207.198.171.', '207.198.170.', '207.198.172.', '207.198.173.', '207.198.174.', '207.198.175.', '207.198.176.', '207.198.177.', '207.198.178.', '207.198.179.', '207.198.180.', '207.198.181.', '207.198.182.', '207.198.183.', '207.198.184.', '207.198.185.', '207.198.186.', '207.198.187.', '207.198.188.', '207.198.189.', '207.198.190.', '207.198.191.', '207.198.192.', '207.198.193.', '207.198.194.', '207.198.195.', '207.198.196.', '207.198.197.', '207.198.199.', '207.198.198.', '207.198.200.', '207.198.201.', '207.198.202.', '207.198.203.', '207.198.204.', '207.198.205.', '207.198.206.', '207.198.207.', '207.198.208.', '207.198.209.', '207.198.210.', '207.198.211.', '207.198.212.', '207.198.213.', '207.198.214.', '207.198.215.', '207.198.216.', '207.198.217.', '207.198.218.', '207.198.219.', '207.198.220.', '207.198.221.', '207.198.222.', '207.198.223.', '207.198.224.', '207.198.225.', '207.198.226.', '207.198.227.', '207.198.228.', '207.198.229.', '207.198.230.', '207.198.231.', '207.198.232.', '207.198.233.', '207.198.234.', '207.198.235.', '207.198.236.', '207.198.237.', '207.198.238.', '207.198.240.', '207.198.241.', '207.198.242.', '207.198.243.', '207.198.244.', '207.198.239.', '207.198.245.', '207.198.246.', '207.198.247.', '207.198.248.', '207.198.249.', '207.198.250.', '207.198.251.', '207.198.253.', '207.198.254.', '207.198.255.', '207.171.18.', '207.198.252.', '209.69.1.', '207.171.31.', '209.69.0.', '209.69.2.', '209.69.3.', '209.69.5.', '209.69.7.', '209.69.6.', '209.69.4.', '209.69.8.', '209.69.10.', '209.69.9.', '209.69.11.', '209.69.13.', '209.69.12.', '209.69.14.', '209.69.15.', '209.69.17.', '209.69.18.', '209.69.16.', '209.69.19.', '209.69.21.', '209.69.22.', '209.69.20.', '209.69.24.', '209.69.25.', '209.69.26.', '209.69.23.', '209.69.29.', '209.69.27.', '209.69.30.', '209.69.31.', '209.69.28.', '209.69.32.', '209.69.34.', '209.69.33.', '209.69.36.', '209.69.37.', '209.69.38.', '209.69.35.', '209.69.41.', '209.69.39.', '209.69.43.', '209.69.40.', '209.69.44.', '209.69.45.', '209.69.42.', '209.69.46.', '209.69.47.', '209.69.49.', '209.69.51.', '209.69.50.', '209.69.52.', '209.69.53.', '209.69.48.', '209.69.55.', '209.69.56.', '209.69.54.', '209.69.57.', '209.69.59.', '209.69.60.', '209.69.58.', '209.69.61.', '209.69.62.', '209.69.65.', '209.69.64.', '209.69.66.', '209.69.63.', '209.69.67.', '209.69.68.', '209.69.70.', '209.69.71.', '209.69.72.', '209.69.73.', '209.69.74.', '209.69.69.', '209.69.76.', '209.69.77.', '209.69.78.', '209.69.75.', '209.69.79.', '209.69.82.', '209.69.81.', '209.69.83.', '209.69.80.', '209.69.85.', '209.69.86.', '209.69.84.', '209.69.89.', '209.69.87.', '209.69.88.', '209.69.90.', '209.69.92.', '209.69.93.', '209.69.94.', '209.69.96.', '209.69.91.', '209.69.97.', '209.69.98.', '209.69.95.', '209.69.99.', '209.69.100.', '209.69.103.', '209.69.104.', '209.69.101.', '209.69.105.', '209.69.102.', '209.69.107.', '209.69.108.', '209.69.106.', '209.69.109.', '209.69.110.', '209.69.111.', '209.69.114.', '209.69.112.', '209.69.115.', '209.69.113.', '209.69.117.', '209.69.118.', '209.69.119.', '209.69.120.', '209.69.121.', '209.69.116.', '209.69.123.', '209.69.124.', '209.69.126.', '209.69.125.', '209.69.122.', '209.69.128.', '209.69.129.', '209.69.127.', '209.69.131.', '209.69.132.', '209.69.130.', '209.69.134.', '209.69.135.', '209.69.133.', '209.69.136.', '209.69.138.', '209.69.137.', '209.69.140.', '209.69.141.', '209.69.143.', '209.69.142.', '209.69.145.', '209.69.139.', '209.69.146.', '209.69.147.', '209.69.144.', '209.69.148.', '209.69.149.', '209.69.151.', '209.69.150.', '209.69.153.', '209.69.152.', '209.69.156.', '209.69.154.', '209.69.157.', '209.69.160.', '209.69.159.', '209.69.158.', '209.69.155.', '209.69.162.', '209.69.163.', '209.69.161.', '209.69.166.', '209.69.165.', '209.69.164.', '209.69.167.', '209.69.169.', '209.69.168.', '209.69.171.', '209.69.170.', '209.69.172.', '209.69.174.', '209.69.175.', '209.69.176.', '209.69.177.', '209.69.173.', '209.69.178.', '209.69.181.', '209.69.179.', '209.69.180.', '209.69.182.', '209.69.185.', '209.69.183.', '209.69.186.', '209.69.187.', '209.69.184.', '209.69.190.', '209.69.189.', '209.69.188.', '209.69.191.', '209.69.192.', '209.69.193.', '209.69.194.', '209.69.196.', '209.69.198.', '209.69.195.', '209.69.197.', '209.69.199.', '209.69.201.', '209.69.200.', '209.69.202.', '209.69.203.', '209.69.205.', '209.69.204.', '209.69.206.', '209.69.207.', '209.69.208.', '209.69.210.', '209.69.209.', '209.69.213.', '209.69.212.', '209.69.215.', '209.69.211.', '209.69.214.', '209.69.217.', '209.69.216.', '209.69.219.', '209.69.220.', '209.69.218.', '209.69.222.', '209.69.221.', '209.69.225.', '209.69.224.', '209.69.226.', '209.69.227.', '209.69.223.', '209.69.229.', '209.69.230.', '209.69.228.', '209.69.233.', '209.69.231.', '209.69.232.', '209.69.235.', '209.69.234.', '209.69.236.', '209.69.237.', '209.69.239.', '209.69.238.', '209.69.241.', '209.69.242.', '209.69.243.', '209.69.244.', '209.69.245.', '209.69.246.', '209.69.240.', '209.69.248.', '209.69.249.', '209.69.247.', '209.69.252.', '209.69.251.', '209.69.250.', '209.69.253.', '209.69.255.', '207.171.26.', '209.107.0.', '209.69.254.', '209.107.3.', '209.107.1.', '209.107.4.', '209.107.6.', '209.107.5.', '209.107.7.', '209.107.2.', '209.107.9.', '209.107.10.', '209.107.8.', '209.107.11.', '209.107.13.', '209.107.14.', '209.107.12.', '209.107.16.', '209.107.15.', '209.107.17.', '209.107.19.', '209.107.21.', '209.107.18.', '209.107.20.', '209.107.23.', '209.107.25.', '209.107.24.', '209.107.26.', '209.107.27.', '209.107.22.', '209.107.28.', '209.107.30.', '209.107.31.', '209.107.29.', '209.107.32.', '209.107.34.', '209.107.35.', '209.107.36.', '209.107.37.', '209.107.33.', '209.107.39.', '209.107.40.', '209.107.38.', '209.107.41.', '209.107.43.', '209.107.42.', '209.107.45.', '209.107.46.', '209.107.44.', '209.107.47.', '209.107.49.', '209.107.48.', '209.107.52.', '209.107.50.', '209.107.53.', '209.107.51.', '209.107.55.', '209.107.54.', '209.107.57.', '209.107.56.', '209.107.58.', '209.107.61.', '209.107.60.', '209.107.59.', '209.107.62.', '209.107.63.', '209.39.1.', '209.39.2.', '209.39.3.', '209.39.4.', '209.39.0.', '209.39.6.', '209.39.5.', '209.39.8.', '209.39.10.', '209.39.11.', '209.39.12.', '209.39.9.', '209.39.13.', '209.39.15.', '209.39.7.', '209.39.16.', '209.39.14.', '209.39.17.', '209.39.18.', '209.39.19.', '209.39.21.', '209.39.22.', '209.39.23.', '209.39.20.', '209.39.26.', '209.39.25.', '209.39.27.', '209.39.24.', '209.39.29.', '209.39.31.', '209.39.30.', '209.39.32.', '209.39.28.', '209.39.34.', '209.39.35.', '209.39.37.', '209.39.36.', '209.39.33.', '209.39.40.', '209.39.39.', '209.39.41.', '209.39.42.', '209.39.43.', '209.39.38.', '209.39.46.', '209.39.45.', '209.39.47.', '209.39.48.', '209.39.49.', '209.39.51.', '209.39.50.', '209.39.52.', '209.39.44.', '209.39.53.', '209.39.54.', '209.39.57.', '209.39.55.', '209.39.58.', '209.39.59.', '209.39.61.', '209.39.56.', '209.39.60.', '209.39.63.', '209.39.64.', '209.39.65.', '209.39.62.', '209.39.66.', '209.39.67.', '209.39.69.', '209.39.68.', '209.39.70.', '209.39.72.', '209.39.73.', '209.39.75.', '209.39.74.', '209.39.76.', '209.39.71.', '209.39.78.', '209.39.79.', '209.39.81.', '209.39.80.', '209.39.83.', '209.39.84.', '209.39.82.', '209.39.85.', '209.39.77.', '209.39.88.', '209.39.87.', '209.39.86.', '209.39.89.', '209.39.91.', '209.39.92.', '209.39.90.', '209.39.94.', '209.39.93.', '209.39.96.', '209.39.95.', '209.39.97.', '209.39.99.', '209.39.98.', '209.39.100.', '209.39.102.', '209.39.103.', '209.39.105.', '209.39.101.', '209.39.104.', '209.39.107.', '209.39.108.', '209.39.109.', '209.39.111.', '209.39.106.', '209.39.113.', '209.39.110.', '209.39.112.', '209.39.115.', '209.39.116.', '209.39.117.', '209.39.118.', '209.39.119.', '209.39.121.', '209.39.120.', '209.39.124.', '209.39.122.', '209.39.123.', '209.39.126.', '209.39.125.', '209.39.127.', '209.39.129.', '209.39.114.', '209.39.128.', '209.39.131.', '209.39.132.', '209.39.134.', '209.39.130.', '209.39.136.', '209.39.135.', '209.39.137.', '209.39.138.', '209.39.139.', '209.39.141.', '209.39.133.', '209.39.143.', '209.39.140.', '209.39.144.', '209.39.142.', '209.39.146.', '209.39.147.', '209.39.145.', '209.39.149.', '209.39.150.', '209.39.148.', '209.39.152.', '209.39.151.', '209.39.153.', '209.39.154.', '209.39.157.', '209.39.156.', '209.39.158.', '209.39.159.', '209.39.161.', '209.39.160.', '209.39.162.', '209.39.163.', '209.39.164.', '209.39.165.', '209.39.166.', '209.39.155.', '209.39.170.', '209.39.171.', '209.39.167.', '209.39.168.', '209.39.172.', '209.39.174.', '209.39.173.', '209.39.175.', '209.39.169.', '209.39.176.', '209.39.178.', '209.39.179.', '209.39.177.', '209.39.180.', '209.39.182.', '209.39.183.', '209.39.181.', '209.39.184.', '209.39.185.', '209.39.186.', '209.39.188.', '209.39.189.', '209.39.191.', '209.39.187.', '209.39.192.', '209.39.190.', '209.39.195.', '209.39.194.', '209.39.193.', '209.39.200.', '209.39.196.', '209.39.198.', '209.39.201.', '209.39.197.', '209.39.202.', '209.39.203.', '209.39.204.', '209.39.199.', '209.39.206.', '209.39.208.', '209.39.207.', '209.39.209.', '209.39.210.', '209.39.205.', '209.39.212.', '209.39.211.', '209.39.213.', '209.39.215.', '209.39.214.', '209.39.217.', '209.39.216.', '209.39.218.', '209.39.219.', '209.39.222.', '209.39.221.', '209.39.223.', '209.39.224.', '209.39.220.', '209.39.227.', '209.39.225.', '209.39.226.', '209.39.229.', '209.39.231.', '209.39.228.', '209.39.230.', '209.39.232.', '209.39.233.', '209.39.235.', '209.39.236.', '209.39.234.', '209.39.238.', '209.39.237.', '209.39.239.', '209.39.241.', '209.39.243.', '209.39.242.', '209.39.240.', '209.39.244.', '209.39.245.', '209.39.246.', '209.39.247.', '209.39.249.', '209.39.248.', '209.39.250.', '209.39.251.', '209.39.253.', '209.39.254.', '209.39.252.', '209.107.64.', '209.107.65.', '209.107.66.', '209.39.255.', '209.107.67.', '209.107.68.', '209.107.69.', '209.107.71.', '209.107.73.', '209.107.70.', '209.107.74.', '209.107.72.', '209.107.75.', '209.107.77.', '209.107.76.', '209.107.79.', '209.107.80.', '209.107.81.', '209.107.83.', '209.107.78.', '209.107.82.', '209.107.85.', '209.107.84.', '209.107.88.', '209.107.87.', '209.107.86.', '209.107.90.', '209.107.92.', '209.107.91.', '209.107.93.', '209.107.89.', '208.123.220.', '209.107.95.', '208.123.221.', '209.107.94.', '209.124.1.', '209.124.2.', '209.124.0.', '209.124.3.', '209.124.4.', '209.124.6.', '209.124.7.', '209.124.8.', '209.124.5.', '209.124.11.', '209.124.10.', '209.124.12.', '209.124.13.', '209.124.14.', '209.124.16.', '209.124.15.', '209.124.9.', '209.124.17.', '209.124.20.', '209.124.19.', '209.124.21.', '209.124.18.', '209.124.23.', '209.124.22.', '209.124.24.', '209.124.25.', '209.124.27.', '209.124.28.', '209.124.29.', '209.124.30.', '209.124.26.', '209.124.31.', '207.196.0.', '207.196.2.', '207.196.1.', '207.196.3.', '207.196.4.', '207.196.7.', '207.196.5.', '207.196.6.', '207.196.10.', '207.196.8.', '207.196.9.', '207.196.11.', '207.196.14.', '207.196.13.', '207.196.15.', '207.196.16.', '207.196.12.', '207.196.17.', '207.196.18.', '207.196.20.', '207.196.21.', '207.196.19.', '207.196.23.', '207.196.22.', '207.196.24.', '207.196.25.', '207.196.26.', '207.196.27.', '207.196.30.', '207.196.29.', '207.196.32.', '207.196.28.', '207.196.31.', '207.196.33.', '207.196.35.', '207.196.34.', '207.196.37.', '207.196.36.', '207.196.40.', '207.196.38.', '207.196.42.', '207.196.41.', '207.196.43.', '207.196.39.', '207.196.44.', '207.196.46.', '207.196.47.', '207.196.45.', '207.196.50.', '207.196.48.', '207.196.52.', '207.196.51.', '207.196.54.', '207.196.49.', '207.196.56.', '207.196.53.', '207.196.58.', '207.196.55.', '207.196.59.', '207.196.60.', '207.196.61.', '207.196.63.', '207.196.62.', '207.196.57.', '207.196.64.', '207.196.65.', '207.196.67.', '207.196.68.', '207.196.69.', '207.196.71.', '207.196.66.', '207.196.73.', '207.196.70.', '207.196.75.', '207.196.76.', '207.196.72.', '207.196.77.', '207.196.78.', '207.196.74.', '207.196.81.', '207.196.80.', '207.196.79.', '207.196.83.', '207.196.85.', '207.196.82.', '207.196.84.', '207.196.86.', '207.196.88.', '207.196.87.', '207.196.90.', '207.196.89.', '207.196.92.', '207.196.91.', '207.196.93.', '207.196.94.', '207.196.96.', '207.196.98.', '207.196.97.', '207.196.99.', '207.196.100.', '207.196.95.', '207.196.101.', '207.196.103.', '207.196.102.', '207.196.104.', '207.196.106.', '207.196.107.', '207.196.109.', '207.196.110.', '207.196.108.', '207.196.105.', '207.196.112.', '207.196.111.', '207.196.113.', '207.196.115.', '207.196.114.', '207.196.117.', '207.196.119.', '207.196.116.', '207.196.120.', '207.196.118.', '207.196.122.', '207.196.121.', '207.196.123.', '207.196.124.', '207.196.125.', '207.196.126.', '207.196.127.', '208.123.221.', '207.171.28.', '209.75.1.', '209.75.2.', '209.75.0.', '209.75.5.', '209.75.3.', '209.75.4.', '209.75.7.', '209.75.6.', '209.75.8.', '209.75.9.', '209.75.10.', '209.75.11.', '209.75.12.', '209.75.13.', '209.75.14.', '209.75.16.', '209.75.15.', '209.75.18.', '209.75.17.', '209.75.20.', '209.75.21.', '209.75.19.', '209.75.22.', '209.75.23.', '209.75.25.', '209.75.24.', '209.75.27.', '209.75.28.', '209.75.30.', '209.75.29.', '209.75.26.', '209.75.32.', '209.75.34.', '209.75.33.', '209.75.31.', '209.75.36.', '209.75.37.', '209.75.38.', '209.75.40.', '209.75.39.', '209.75.43.', '209.75.41.', '209.75.35.', '209.75.44.', '209.75.45.', '209.75.46.', '209.75.48.', '209.75.47.', '209.75.49.', '209.75.50.', '209.75.53.', '209.75.42.', '209.75.52.', '209.75.54.', '209.75.51.', '209.75.56.', '209.75.57.', '209.75.58.', '209.75.59.', '209.75.60.', '209.75.61.', '209.75.62.', '209.75.63.', '209.75.55.', '209.75.66.', '209.75.65.', '209.75.67.', '209.75.64.', '209.75.69.', '209.75.68.', '209.75.70.', '209.75.71.', '209.75.73.', '209.75.74.', '209.75.72.', '209.75.75.', '209.75.76.', '209.75.78.', '209.75.79.', '209.75.77.', '209.75.83.', '209.75.80.', '209.75.81.', '209.75.85.', '209.75.84.', '209.75.86.', '209.75.87.', '209.75.88.', '209.75.89.', '209.75.90.', '209.75.91.', '209.75.92.', '209.75.93.', '209.75.82.', '209.75.95.', '209.75.96.', '209.75.97.', '209.75.98.', '209.75.94.', '209.75.100.', '209.75.99.', '209.75.101.', '209.75.102.', '209.75.103.', '209.75.106.', '209.75.104.', '209.75.108.', '209.75.109.', '209.75.105.', '209.75.110.', '209.75.107.', '209.75.112.', '209.75.111.', '209.75.114.', '209.75.115.', '209.75.113.', '209.75.116.', '209.75.118.', '209.75.117.', '209.75.120.', '209.75.121.', '209.75.123.', '209.75.124.', '209.75.122.', '209.75.126.', '209.75.125.', '209.75.128.', '209.75.119.', '209.75.129.', '209.75.131.', '209.75.132.', '209.75.130.', '209.75.127.', '209.75.134.', '209.75.135.', '209.75.133.', '209.75.137.', '209.75.139.', '209.75.138.', '209.75.136.', '209.75.140.', '209.75.142.', '209.75.141.', '209.75.145.', '209.75.144.', '209.75.146.', '209.75.143.', '209.75.148.', '209.75.150.', '209.75.151.', '209.75.149.', '209.75.154.', '209.75.147.', '209.75.152.', '209.75.153.', '209.75.157.', '209.75.156.', '209.75.155.', '209.75.159.', '209.75.160.', '209.75.158.', '209.75.163.', '209.75.162.', '209.75.161.', '209.75.166.', '209.75.165.', '209.75.164.', '209.75.169.', '209.75.170.', '209.75.168.', '209.75.167.', '209.75.171.', '209.75.172.', '209.75.174.', '209.75.173.', '209.75.175.', '209.75.176.', '209.75.179.', '209.75.178.', '209.75.177.', '209.75.181.', '209.75.184.', '209.75.180.', '209.75.182.', '209.75.185.', '209.75.187.', '209.75.183.', '209.75.188.', '209.75.189.', '209.75.191.', '209.75.186.', '209.75.192.', '209.75.193.', '209.75.194.', '209.75.195.', '209.75.190.', '209.75.197.', '209.75.198.', '209.75.200.', '209.75.199.', '209.75.202.', '209.75.204.', '209.75.207.', '209.75.206.', '209.75.205.', '209.75.201.', '209.75.209.', '209.75.208.', '209.75.210.', '209.75.211.', '209.75.212.', '209.75.213.', '209.75.214.', '209.75.215.', '209.75.217.', '209.75.218.', '209.75.216.', '209.75.219.', '209.75.220.', '209.75.221.', '209.75.222.', '209.75.223.', '209.75.224.', '209.75.225.', '209.75.226.', '209.75.227.', '209.75.228.', '209.75.229.', '209.75.230.', '209.75.231.', '209.75.232.', '209.75.233.', '209.75.234.', '209.75.235.', '209.75.236.', '209.75.237.', '209.75.239.', '209.75.238.', '209.75.240.', '209.75.241.', '209.75.242.', '209.75.243.', '209.75.244.', '209.75.245.', '209.75.246.', '209.75.248.', '209.75.247.', '209.75.249.', '209.75.250.', '209.75.251.', '209.75.253.', '209.75.196.', '209.75.203.', '209.75.252.', '209.75.255.', '209.75.254.', '209.227.1.', '209.227.0.', '209.227.3.', '209.227.2.', '209.227.6.', '209.227.7.', '209.227.8.', '209.227.9.', '209.227.10.', '209.227.11.', '209.227.5.', '209.227.12.', '209.227.15.', '209.227.4.', '209.227.13.', '209.227.14.', '209.227.16.', '209.227.18.', '209.227.19.', '209.227.17.', '209.227.20.', '209.227.21.', '209.227.23.', '209.227.24.', '209.227.25.', '209.227.26.', '209.227.27.', '209.227.28.', '209.227.29.', '209.227.30.', '209.227.32.', '209.227.31.', '209.227.33.', '209.227.34.', '209.227.36.', '209.227.22.', '209.227.37.', '209.227.39.', '209.227.38.', '209.227.41.', '209.227.42.', '209.227.40.', '209.227.45.', '209.227.43.', '209.227.46.', '209.227.44.', '209.227.47.', '209.227.48.', '209.227.49.', '209.227.50.', '209.227.52.', '209.227.51.', '209.227.53.', '209.227.54.', '209.227.57.', '209.227.58.', '209.227.55.', '209.227.59.', '209.227.35.', '209.227.56.', '209.227.60.', '209.227.61.', '209.227.63.', '209.227.64.', '209.227.62.', '209.227.65.', '209.227.67.', '209.227.68.', '209.227.70.', '209.227.69.', '209.227.71.', '209.227.73.', '209.227.74.', '209.227.66.', '209.227.72.', '209.227.75.', '209.227.76.', '209.227.78.', '209.227.77.', '209.227.79.', '209.227.80.', '209.227.82.', '209.227.81.', '209.227.83.', '209.227.85.', '209.227.84.', '209.227.86.', '209.227.87.', '209.227.88.', '209.227.89.', '209.227.90.', '209.227.91.', '209.227.93.', '209.227.92.', '209.227.94.', '209.227.96.', '209.227.95.', '209.227.97.', '209.227.99.', '209.227.98.', '209.227.100.', '209.227.102.', '209.227.101.', '209.227.103.', '209.227.104.', '209.227.105.', '209.227.107.', '209.227.108.', '209.227.106.', '209.227.112.', '209.227.109.', '209.227.110.', '209.227.111.', '209.227.114.', '209.227.115.', '209.227.116.', '209.227.117.', '209.227.118.', '209.227.119.', '209.227.121.', '209.227.113.', '209.227.120.', '209.227.123.', '209.227.124.', '209.227.125.', '209.227.126.', '209.227.127.', '209.24.8.', '209.227.122.', '209.70.0.', '209.70.2.', '209.70.3.', '209.70.4.', '209.70.5.', '209.70.1.', '209.70.7.', '209.70.8.', '209.70.10.', '209.70.12.', '209.70.11.', '209.70.13.', '209.70.6.', '209.70.9.', '209.70.17.', '209.70.16.', '209.70.18.', '209.70.19.', '209.70.20.', '209.70.21.', '209.70.22.', '209.70.24.', '209.70.25.', '209.70.26.', '209.70.27.', '209.70.28.', '209.70.14.', '209.70.29.', '209.70.31.', '209.70.32.', '209.70.30.', '209.70.33.', '209.70.34.', '209.70.35.', '209.70.37.', '209.70.38.', '209.70.39.', '209.70.40.', '209.70.41.', '209.70.42.', '209.70.43.', '209.70.44.', '209.70.45.', '209.70.15.', '209.70.46.', '209.70.36.', '209.70.47.', '209.70.48.', '209.70.50.', '209.70.51.', '209.70.52.', '209.70.49.', '209.70.53.', '209.70.54.', '209.70.55.', '209.70.56.', '209.70.58.', '209.70.59.', '209.70.60.', '209.70.61.', '209.70.62.', '209.70.57.', '209.70.64.', '209.70.63.', '209.70.65.', '209.70.66.', '209.70.67.', '209.70.68.', '209.70.69.', '209.70.71.', '209.70.70.', '209.70.73.', '209.70.72.', '209.70.74.', '209.70.75.', '209.70.76.', '209.70.77.', '209.70.23.', '209.70.79.', '209.70.81.', '209.70.80.', '209.70.82.', '209.70.83.', '209.70.85.', '209.70.84.', '209.70.87.', '209.70.86.', '209.70.88.', '209.70.89.', '209.70.90.', '209.70.91.', '209.70.93.', '209.70.92.', '209.70.95.', '209.70.96.', '209.70.97.', '209.70.98.', '209.70.94.', '209.70.100.', '209.70.99.', '209.70.102.', '209.70.78.', '209.70.103.', '209.70.106.', '209.70.101.', '209.70.105.', '209.70.107.', '209.70.104.', '209.70.109.', '209.70.110.', '209.70.108.', '209.70.111.', '209.70.112.', '209.70.113.', '209.70.115.', '209.70.116.', '209.70.118.', '209.70.117.', '209.70.114.', '209.70.120.', '209.70.119.', '209.70.121.', '209.70.122.', '209.70.124.', '209.70.125.', '209.70.123.', '209.70.128.', '209.70.127.', '209.70.130.', '209.70.129.', '209.70.131.', '209.70.132.', '209.70.134.', '209.70.133.', '209.70.135.', '209.70.126.', '209.70.137.', '209.70.139.', '209.70.138.', '209.70.140.', '209.70.141.', '209.70.136.', '209.70.143.', '209.70.144.', '209.70.147.', '209.70.145.', '209.70.142.', '209.70.146.', '209.70.149.', '209.70.150.', '209.70.148.', '209.70.151.', '209.70.153.', '209.70.154.', '209.70.156.', '209.70.155.', '209.70.158.', '209.70.152.', '209.70.160.', '209.70.159.', '209.70.157.', '209.70.161.', '209.70.163.', '209.70.165.', '209.70.164.', '209.70.167.', '209.70.166.', '209.70.168.', '209.70.162.', '209.70.169.', '209.70.170.', '209.70.172.', '209.70.173.', '209.70.175.', '209.70.171.', '209.70.174.', '209.70.177.', '209.70.176.', '209.70.179.', '209.70.178.', '209.70.181.', '209.70.180.', '209.70.183.', '209.70.184.', '209.70.185.', '209.70.186.', '209.70.187.', '209.70.188.', '209.70.182.', '209.70.191.', '209.70.190.', '209.70.193.', '209.70.192.', '209.70.189.', '209.70.196.', '209.70.194.', '209.70.195.', '209.70.197.', '209.70.198.', '209.70.199.', '209.70.200.', '209.70.201.', '209.70.202.', '209.70.203.', '209.70.204.', '209.70.206.', '209.70.208.', '209.70.207.', '209.70.210.', '209.70.209.', '209.70.213.', '209.70.205.', '209.70.211.', '209.70.215.', '209.70.214.', '209.70.216.', '209.70.212.', '209.70.217.', '209.70.219.', '209.70.218.', '209.70.221.', '209.70.222.', '209.70.223.', '209.70.224.', '209.70.225.', '209.70.226.', '209.70.227.', '209.70.220.', '209.70.229.', '209.70.228.', '209.70.231.', '209.70.232.', '209.70.230.', '209.70.233.', '209.70.235.', '209.70.236.', '209.70.237.', '209.70.238.', '209.70.239.', '209.70.240.', '209.70.241.', '209.70.243.', '209.70.244.', '209.70.234.', '209.70.246.', '209.70.245.', '209.70.247.', '209.70.248.', '209.70.242.', '209.70.252.', '209.70.249.', '209.70.251.', '209.70.250.', '209.70.253.', '209.70.254.', '209.70.255.', '209.238.0.', '209.238.2.', '209.238.4.', '209.238.1.', '209.238.5.', '209.238.8.', '209.238.6.', '209.238.7.', '209.238.10.', '209.238.11.', '209.238.12.', '209.238.13.', '209.238.3.', '209.238.14.', '209.238.17.', '209.238.16.', '209.238.15.', '209.238.18.', '209.238.20.', '209.238.9.', '209.238.19.', '209.238.25.', '209.238.24.', '209.238.26.', '209.238.21.', '209.238.22.', '209.238.23.', '209.238.28.', '209.238.29.', '209.238.30.', '209.238.31.', '209.238.27.', '209.238.34.', '209.238.33.', '209.238.32.', '209.238.36.', '209.238.40.', '209.238.38.', '209.238.35.', '209.238.39.', '209.238.41.', '209.238.42.', '209.238.37.', '209.238.43.', '209.238.45.', '209.238.44.', '209.238.46.', '209.238.48.', '209.238.49.', '209.238.50.', '209.238.52.', '209.238.53.', '209.238.51.', '209.238.54.', '209.238.55.', '209.238.56.', '209.238.58.', '209.238.59.', '209.238.57.', '209.238.60.', '209.238.62.', '209.238.47.', '209.238.61.', '209.238.63.', '209.238.64.', '209.238.66.', '209.238.65.', '209.238.68.', '209.238.67.', '209.238.70.', '209.238.72.', '209.238.71.', '209.238.73.', '209.238.74.', '209.238.76.', '209.238.69.', '209.238.77.', '209.238.78.', '209.238.79.', '209.238.81.', '209.238.75.', '209.238.83.', '209.238.82.', '209.238.80.', '209.238.84.', '209.238.87.', '209.238.86.', '209.238.89.', '209.238.85.', '209.238.90.', '209.238.91.', '209.238.93.', '209.238.88.', '209.238.92.', '209.238.94.', '209.238.97.', '209.238.96.', '209.238.98.', '209.238.99.', '209.238.100.', '209.238.95.', '209.238.101.', '209.238.103.', '209.238.104.', '209.238.105.', '209.238.106.', '209.238.107.', '209.238.108.', '209.238.110.', '209.238.109.', '209.238.102.', '209.238.112.', '209.238.114.', '209.238.111.', '209.238.115.', '209.238.116.', '209.238.118.', '209.238.119.', '209.238.120.', '209.238.113.', '209.238.123.', '209.238.117.', '209.238.122.', '209.238.124.', '209.238.125.', '209.238.127.', '209.238.126.', '209.238.121.', '209.238.129.', '209.238.128.', '209.238.131.', '209.238.130.', '209.238.133.', '209.238.132.', '209.238.134.', '209.238.135.', '209.238.137.', '209.238.136.', '209.238.138.', '209.238.139.', '209.238.142.', '209.238.140.', '209.238.141.', '209.238.144.', '209.238.145.', '209.238.147.', '209.238.146.', '209.238.148.', '209.238.143.', '209.238.149.', '209.238.150.', '209.238.152.', '209.238.151.', '209.238.154.', '209.238.155.', '209.238.156.', '209.238.157.', '209.238.158.', '209.238.153.', '209.238.160.', '209.238.159.', '209.238.162.', '209.238.163.', '209.238.165.', '209.238.161.', '209.238.166.', '209.238.168.', '209.238.169.', '209.238.167.', '209.238.171.', '209.238.164.', '209.238.170.', '209.238.172.', '209.238.173.', '209.238.174.', '209.238.175.', '209.238.176.', '209.238.178.', '209.238.180.', '209.238.179.', '209.238.177.', '209.238.182.', '209.238.183.', '209.238.184.', '209.238.185.', '209.238.186.', '209.238.181.', '209.238.188.', '209.238.187.', '209.238.189.', '209.238.191.', '209.238.190.', '209.238.192.', '209.238.193.', '209.238.195.', '209.238.196.', '209.238.198.', '209.238.194.', '209.238.199.', '209.238.197.', '209.238.200.', '209.238.203.', '209.238.202.', '209.238.201.', '209.238.205.', '209.238.206.', '209.238.204.', '209.238.207.', '209.238.208.', '209.238.210.', '209.238.209.', '209.238.212.', '209.238.214.', '209.238.211.', '209.238.216.', '209.238.215.', '209.238.217.', '209.238.213.', '209.238.219.', '209.238.218.', '209.238.222.', '209.238.221.', '209.238.220.', '209.238.223.', '209.238.225.', '209.238.226.', '209.238.224.', '209.238.228.', '209.238.229.', '209.238.227.', '209.238.230.', '209.238.231.', '209.238.234.', '209.238.232.', '209.238.235.', '209.238.236.', '209.238.238.', '209.238.237.', '209.238.233.', '209.238.239.', '209.238.241.', '209.238.242.', '209.238.243.', '209.238.240.', '209.238.246.', '209.238.244.', '209.238.245.', '209.238.249.', '209.238.247.', '209.238.248.', '209.238.251.', '209.238.250.', '209.238.252.', '209.238.254.', '209.238.255.', '209.97.129.', '209.238.253.', '209.97.130.', '209.97.132.', '209.97.128.', '209.97.131.', '209.97.136.', '209.97.133.', '209.97.137.', '209.97.135.', '209.97.139.', '209.97.134.', '209.97.138.', '209.97.141.', '209.97.140.', '209.97.176.', '209.97.177.', '209.97.143.', '209.97.178.', '209.97.142.', '209.97.181.', '209.97.179.', '209.97.182.', '209.97.184.', '209.97.183.', '209.97.186.', '209.97.185.', '209.97.187.', '209.97.188.', '209.97.189.', '209.97.190.', '209.97.180.', '209.21.0.', '209.97.191.', '209.21.2.', '209.21.3.', '209.21.1.', '209.21.4.', '209.21.5.', '209.21.7.', '209.21.8.', '209.21.9.', '209.21.10.', '209.21.11.', '209.21.12.', '209.21.14.', '209.21.13.', '209.21.15.', '209.21.16.', '209.21.17.', '209.21.18.', '209.21.19.', '209.21.20.', '209.21.21.', '209.21.23.', '209.21.6.', '209.21.22.', '209.21.25.', '209.21.26.', '209.21.28.', '209.21.30.', '209.21.29.', '209.21.31.', '209.21.33.', '209.21.32.', '209.21.34.', '209.21.35.', '209.21.36.', '209.21.38.', '209.21.37.', '209.21.39.', '209.21.27.', '209.21.41.', '209.21.42.', '209.21.43.', '209.21.24.', '209.21.44.', '209.21.46.', '209.21.45.', '209.21.48.', '209.21.49.', '209.21.50.', '209.21.47.', '209.21.52.', '209.21.40.', '209.21.54.', '209.21.53.', '209.21.56.', '209.21.55.', '209.21.57.', '209.21.58.', '209.21.60.', '209.21.59.', '209.21.62.', '209.21.61.', '209.162.64.', '209.21.63.', '209.162.65.', '209.162.66.', '209.162.67.', '209.162.70.', '209.162.69.', '209.162.71.', '209.162.72.', '209.162.73.', '209.162.74.', '209.162.68.', '209.21.51.', '209.162.75.', '209.162.76.', '209.162.77.', '209.162.78.', '209.162.80.', '209.162.81.', '209.162.82.', '209.162.84.', '209.162.83.', '209.162.86.', '209.162.85.', '209.162.87.', '209.162.79.', '209.162.88.', '209.162.90.', '209.162.89.', '209.162.92.', '209.162.91.', '209.162.93.', '209.162.96.', '209.162.95.', '209.162.94.', '209.162.99.', '209.162.98.', '209.162.100.', '209.162.101.', '209.162.103.', '209.162.102.', '209.162.104.', '209.162.97.', '209.162.105.', '209.162.108.', '209.162.107.', '209.162.110.', '209.162.109.', '209.162.106.', '209.162.115.', '209.162.112.', '209.162.113.', '209.162.114.', '209.162.116.', '209.162.117.', '209.162.118.', '209.162.119.', '209.162.120.', '209.162.121.', '209.162.124.', '209.162.111.', '209.162.125.', '209.162.127.', '209.43.128.', '209.43.129.', '209.43.130.', '209.43.131.', '209.43.132.', '209.43.133.', '209.43.134.', '209.43.135.', '209.162.126.', '209.43.136.', '209.162.123.', '209.43.138.', '209.43.139.', '209.43.140.', '209.43.142.', '209.43.143.', '209.43.145.', '209.43.144.', '209.43.141.', '209.43.146.', '209.43.148.', '209.43.147.', '209.43.150.', '209.43.137.', '209.43.153.', '209.43.152.', '209.43.149.', '209.43.154.', '209.43.157.', '209.43.155.', '209.43.158.', '209.43.159.', '209.43.160.', '209.43.161.', '209.43.162.', '209.162.122.', '209.43.163.', '209.43.164.', '209.43.165.', '209.43.166.', '209.43.151.', '209.43.168.', '209.43.167.', '209.43.156.', '209.43.170.', '209.43.173.', '209.43.169.', '209.43.174.', '209.43.171.', '209.43.175.', '209.43.176.', '209.43.177.', '209.43.178.', '209.43.179.', '209.43.180.', '209.43.181.', '209.43.182.', '209.43.183.', '209.43.172.', '209.43.185.', '209.43.187.', '209.43.186.', '209.43.188.', '209.43.189.', '209.43.190.', '209.43.193.', '209.43.192.', '209.43.184.', '209.43.194.', '209.43.191.', '209.43.196.', '209.43.198.', '209.43.195.', '209.43.200.', '209.43.201.', '209.43.199.', '209.43.202.', '209.43.197.', '209.43.203.', '209.43.204.', '209.43.205.', '209.43.207.', '209.43.208.', '209.43.209.', '209.43.210.', '209.43.211.', '209.43.212.', '209.43.215.', '209.43.213.', '209.43.214.', '209.43.216.', '209.43.217.', '209.43.218.', '209.43.220.', '209.43.219.', '209.43.206.', '209.43.223.', '209.43.222.', '209.43.225.', '209.43.224.', '209.43.226.', '209.43.221.', '209.43.228.', '209.43.229.', '209.43.230.', '209.43.231.', '209.43.232.', '209.43.233.', '209.43.234.', '209.43.235.', '209.43.236.', '209.43.238.', '209.43.237.', '209.43.239.', '209.43.240.', '209.43.242.', '209.43.243.', '209.43.227.', '209.43.245.', '209.43.244.', '209.43.247.', '209.43.248.', '209.43.249.', '209.43.246.', '209.43.250.', '209.43.252.', '209.43.253.', '209.43.254.', '209.43.255.', '209.94.0.', '209.94.1.', '209.94.2.', '209.43.251.', '209.94.4.', '209.94.3.', '209.43.241.', '209.94.5.', '209.94.6.', '209.94.7.', '209.94.10.', '209.94.8.', '209.94.11.', '209.94.12.', '209.94.13.', '209.94.14.', '209.94.9.', '209.94.15.', '209.94.17.', '209.94.16.', '209.94.19.', '209.94.18.', '209.94.21.', '209.94.20.', '209.94.23.', '209.94.22.', '209.94.26.', '209.94.25.', '209.94.28.', '209.94.29.', '209.94.27.', '209.94.24.', '209.94.30.', '209.97.160.', '209.94.31.', '209.97.162.', '209.97.163.', '209.97.164.', '209.97.165.', '209.97.167.', '209.97.166.', '209.97.168.', '209.97.169.', '209.97.170.', '209.97.171.', '209.97.161.', '209.97.172.', '209.97.174.', '209.97.175.', '209.212.227.', '209.97.173.', '209.212.224.', '207.171.24.', '209.212.225.', '209.212.226.', '209.212.228.', '209.212.230.', '209.212.229.', '209.212.231.', '209.212.234.', '209.212.233.', '209.212.232.', '209.212.236.', '209.212.237.', '209.212.238.', '209.212.235.', '209.168.3.', '209.212.239.', '209.168.2.', '209.168.4.', '209.168.1.', '209.168.0.', '209.168.6.', '209.168.7.', '209.168.5.', '209.168.10.', '209.168.8.', '209.168.11.', '209.168.12.', '209.168.14.', '209.168.9.', '209.168.13.', '209.168.15.', '209.168.16.', '209.168.19.', '209.168.17.', '209.168.22.', '209.168.23.', '209.168.20.', '209.168.21.', '209.168.18.', '209.168.25.', '209.168.26.', '209.168.27.', '209.168.28.', '209.168.30.', '209.168.29.', '209.168.32.', '209.168.24.', '209.168.33.', '209.168.31.', '209.168.34.', '209.168.35.', '209.168.36.', '209.168.39.', '209.168.38.', '209.168.37.', '209.168.41.', '209.168.42.', '209.168.43.', '209.168.44.', '209.168.46.', '209.168.45.', '209.168.47.', '209.168.49.', '209.168.48.', '209.168.50.', '209.168.40.', '209.168.53.', '209.168.51.', '209.168.54.', '209.168.55.', '209.168.52.', '209.168.58.', '209.168.57.', '209.168.56.', '209.168.59.', '209.168.60.', '209.168.62.', '209.168.63.', '209.168.64.', '209.168.66.', '209.168.65.', '209.168.67.', '209.168.69.', '209.168.70.', '209.168.68.', '209.168.61.', '209.168.71.', '209.168.73.', '209.168.74.', '209.168.75.', '209.168.76.', '209.168.77.', '209.168.78.', '209.168.79.', '209.168.80.', '209.168.81.', '209.168.72.', '209.168.82.', '209.168.84.', '209.168.83.', '209.168.85.', '209.168.86.', '209.168.88.', '209.168.87.', '209.168.89.', '209.168.91.', '209.168.94.', '209.168.92.', '209.168.93.', '209.168.90.', '209.168.96.', '209.168.98.', '209.168.99.', '209.168.100.', '209.168.101.', '209.168.102.', '209.168.103.', '209.168.104.', '209.168.106.', '209.168.105.', '209.168.107.', '209.168.95.', '209.168.108.', '209.168.109.', '209.168.110.', '209.168.111.', '209.168.112.', '209.168.113.', '209.168.114.', '209.168.115.', '209.168.116.', '209.168.117.', '209.168.118.', '209.168.119.', '209.168.120.', '209.168.121.', '209.168.122.', '209.168.123.', '209.168.124.', '209.168.125.', '209.168.126.', '209.168.97.', '209.168.127.', '209.170.2.', '209.170.3.', '209.170.0.', '209.170.5.', '209.170.6.', '209.170.7.', '209.170.9.', '209.170.8.', '209.170.10.', '209.170.11.', '209.170.13.', '209.170.12.', '209.170.14.', '209.170.15.', '209.170.16.', '209.170.17.', '209.170.18.', '209.170.19.', '209.170.20.', '209.170.21.', '209.170.22.', '209.170.23.', '209.170.24.', '209.170.25.', '209.170.26.', '209.170.28.', '209.170.27.', '209.170.29.', '209.170.30.', '209.170.31.', '209.170.32.', '209.170.33.', '209.170.34.', '209.170.1.', '209.170.35.', '209.170.36.', '209.170.37.', '209.170.39.', '209.170.38.', '209.170.40.', '209.170.41.', '209.170.42.', '209.170.44.', '209.170.43.', '209.170.45.', '209.170.46.', '209.170.47.', '209.170.48.', '209.170.49.', '209.170.50.', '209.170.51.', '209.170.52.', '209.170.54.', '209.170.55.', '209.170.56.', '209.170.57.', '209.170.58.', '209.170.59.', '209.170.60.', '209.170.53.', '209.170.62.', '209.170.61.', '209.157.0.', '209.170.63.', '209.157.1.', '209.157.3.', '209.170.4.', '209.157.5.', '209.157.2.', '209.157.4.', '209.157.6.', '209.157.7.', '209.157.8.', '209.157.10.', '209.157.9.', '209.157.11.', '209.157.13.', '209.157.14.', '209.157.15.', '209.157.16.', '209.157.17.', '209.157.18.', '209.157.19.', '209.157.20.', '209.157.21.', '209.157.22.', '209.157.23.', '209.157.24.', '209.157.25.', '209.157.26.', '209.157.28.', '209.157.27.', '209.157.30.', '209.157.12.', '209.157.29.', '209.157.31.', '209.157.33.', '209.157.32.', '209.157.35.', '209.157.36.', '209.157.37.', '209.157.34.', '209.157.38.', '209.157.41.', '209.157.39.', '209.157.40.', '209.157.42.', '209.157.43.', '209.157.44.', '209.157.46.', '209.157.45.', '209.157.47.', '209.157.48.', '209.157.50.', '209.157.49.', '209.157.51.', '209.157.52.', '209.157.53.', '209.157.55.', '209.157.54.', '209.157.57.', '209.157.58.', '209.157.56.', '209.157.59.', '209.157.60.', '209.157.62.', '209.157.63.', '209.157.64.', '209.157.65.', '209.157.66.', '209.157.67.', '209.157.68.', '209.157.61.', '209.157.71.', '209.157.70.', '209.157.69.', '209.157.72.', '209.157.73.', '209.157.74.', '209.157.76.', '209.157.77.', '209.157.78.', '209.157.75.', '209.157.80.', '209.157.79.', '209.157.81.', '209.157.84.', '209.157.83.', '209.157.85.', '209.157.82.', '209.157.87.', '209.157.86.', '209.157.88.', '209.157.89.', '209.157.90.', '209.157.91.', '209.157.93.', '209.157.95.', '209.157.94.', '209.157.92.', '209.157.97.', '209.157.99.', '209.157.98.', '209.157.100.', '209.157.101.', '209.157.96.', '209.157.103.', '209.157.102.', '209.157.105.', '209.157.106.', '209.157.107.', '209.157.108.', '209.157.109.', '209.157.110.', '209.157.112.', '209.157.111.', '209.157.114.', '209.157.113.', '209.157.104.', '209.157.116.', '209.157.115.', '209.157.118.', '209.157.119.', '209.157.117.', '209.157.121.', '209.157.122.', '209.157.123.', '209.157.120.', '209.157.124.', '209.157.126.', '209.157.127.', '209.157.125.', '209.157.129.', '209.157.128.', '209.157.131.', '209.157.133.', '209.157.134.', '209.157.130.', '209.157.137.', '209.157.135.', '209.157.132.', '209.157.138.', '209.157.136.', '209.157.140.', '209.157.141.', '209.157.139.', '209.157.142.', '209.157.145.', '209.157.143.', '209.157.144.', '209.157.147.', '209.157.148.', '209.157.150.', '209.157.146.', '209.157.152.', '209.157.149.', '209.157.153.', '209.157.151.', '209.157.155.', '209.157.154.', '209.157.156.', '209.157.159.', '209.157.158.', '209.157.160.', '209.157.157.', '209.157.161.', '209.157.163.', '209.157.162.', '209.157.164.', '209.157.166.', '209.157.167.', '209.157.165.', '209.157.169.', '209.157.168.', '209.157.171.', '209.157.173.', '209.157.170.', '209.157.175.', '209.157.174.', '209.157.172.', '209.157.178.', '209.157.176.', '209.157.179.', '209.157.180.', '209.157.177.', '209.157.181.', '209.157.183.', '209.157.182.', '209.157.184.', '209.157.185.', '209.157.186.', '209.157.187.', '209.157.190.', '209.157.188.', '209.157.189.', '209.157.193.', '209.157.191.', '209.157.195.', '209.157.194.', '209.157.192.', '209.157.198.', '209.157.196.', '209.157.199.', '209.157.200.', '209.157.201.', '209.157.203.', '209.157.197.', '209.157.202.', '209.157.204.', '209.157.205.', '209.157.208.', '209.157.207.', '209.157.206.', '209.157.210.', '209.157.211.', '209.157.209.', '209.157.212.', '209.157.213.', '209.157.214.', '209.157.215.', '209.157.216.', '209.157.218.', '209.157.220.', '209.157.217.', '209.157.223.', '209.157.221.', '209.157.219.', '209.157.222.', '209.157.226.', '209.157.224.', '209.157.228.', '209.157.227.', '209.157.229.', '209.157.230.', '209.157.232.', '209.157.225.', '209.157.231.', '209.157.233.', '209.157.235.', '209.157.236.', '209.157.238.', '209.157.237.', '209.157.234.', '209.157.239.', '209.157.241.', '209.157.242.', '209.157.243.', '209.157.244.', '209.157.245.', '209.157.246.', '209.157.248.', '209.157.247.', '209.157.250.', '209.157.249.', '209.157.251.', '209.157.252.', '209.157.240.', '209.157.254.', '209.157.255.', '209.189.0.', '209.157.253.', '209.189.2.', '209.189.3.', '209.189.5.', '209.189.1.', '209.189.4.', '209.189.6.', '209.189.8.', '209.189.10.', '209.189.9.', '209.189.11.', '209.189.7.', '209.189.12.', '209.189.13.', '209.189.15.', '209.189.16.', '209.189.14.', '209.189.18.', '209.189.20.', '209.189.17.', '209.189.19.', '209.189.21.', '209.189.23.', '209.189.24.', '209.189.22.', '209.189.26.', '209.189.27.', '209.189.25.', '209.189.30.', '209.189.31.', '209.189.28.', '209.189.29.', '209.189.32.', '209.189.33.', '209.189.35.', '209.189.34.', '209.189.36.', '209.189.38.', '209.189.37.', '209.189.40.', '209.189.39.', '209.189.41.', '209.189.42.', '209.189.44.', '209.189.46.', '209.189.45.', '209.189.48.', '209.189.47.', '209.189.49.', '209.189.43.', '209.189.52.', '209.189.51.', '209.189.53.', '209.189.50.', '209.189.55.', '209.189.56.', '209.189.57.', '209.189.58.', '209.189.59.', '209.189.60.', '209.189.61.', '209.189.62.', '209.189.63.', '209.189.64.', '209.189.65.', '209.189.66.', '209.189.67.', '209.189.68.', '209.189.69.', '209.189.70.', '209.189.71.', '209.189.72.', '209.189.73.', '209.189.74.', '209.189.75.', '209.189.76.', '209.189.77.', '209.189.79.', '209.189.78.', '209.189.81.', '209.189.80.', '209.189.82.', '209.189.83.', '209.189.84.', '209.189.85.', '209.189.54.', '209.189.87.', '209.189.86.', '209.189.89.', '209.189.90.', '209.189.91.', '209.189.93.', '209.189.88.', '209.189.94.', '209.189.95.', '209.189.92.', '209.189.96.', '209.189.98.', '209.189.97.', '209.189.100.', '209.189.101.', '209.189.102.', '209.189.103.', '209.189.99.', '209.189.104.', '209.189.107.', '209.189.105.', '209.189.108.', '209.189.106.', '209.189.109.', '209.189.111.', '209.189.113.', '209.189.110.', '209.189.112.', '209.189.114.', '209.189.115.', '209.189.116.', '209.189.118.', '209.189.119.', '209.189.120.', '209.189.117.', '209.189.123.', '209.189.121.', '209.189.125.', '209.189.122.', '209.189.124.', '209.207.128.', '209.189.126.', '209.189.127.', '209.207.130.', '209.207.129.', '209.207.133.', '209.207.132.', '209.207.131.', '209.207.134.', '209.207.136.', '209.207.135.', '209.207.137.', '209.207.138.', '209.207.139.', '209.207.140.', '209.207.142.', '209.207.143.', '209.207.144.', '209.207.146.', '209.207.145.', '209.207.148.', '209.207.149.', '209.207.150.', '209.207.151.', '209.207.152.', '209.207.153.', '209.207.154.', '209.207.155.', '209.207.156.', '209.207.157.', '209.207.158.', '209.207.159.', '209.207.160.', '209.207.161.', '209.207.162.', '209.207.163.', '209.207.164.', '209.207.165.', '209.207.166.', '209.207.167.', '209.207.168.', '209.207.169.', '209.207.170.', '209.207.171.', '209.207.172.', '209.207.173.', '209.207.141.', '209.207.175.', '209.207.147.', '209.207.174.', '209.207.177.', '209.207.176.', '209.207.178.', '209.207.180.', '209.207.181.', '209.207.182.', '209.207.183.', '209.207.184.', '209.207.185.', '209.207.186.', '209.207.187.', '209.207.188.', '209.207.189.', '209.207.190.', '209.207.191.', '209.207.192.', '209.207.195.', '209.207.193.', '209.207.194.', '209.207.197.', '209.207.199.', '209.207.198.', '209.207.200.', '209.207.201.', '209.207.202.', '209.207.203.', '209.207.204.', '209.207.205.', '209.207.207.', '209.207.208.', '209.207.209.', '209.207.210.', '209.207.211.', '209.207.196.', '209.207.213.', '209.207.214.', '209.207.215.', '209.207.216.', '209.207.217.', '209.207.218.', '209.207.219.', '209.207.220.', '209.207.221.', '209.207.222.', '209.207.179.', '209.207.206.', '209.207.224.', '209.207.225.', '209.207.226.', '209.207.227.', '209.207.228.', '209.207.229.', '209.207.230.', '209.207.231.', '209.207.232.', '209.207.233.', '209.207.234.', '209.207.235.', '209.207.236.', '209.207.237.', '209.207.238.', '209.207.239.', '209.207.240.', '209.207.241.', '209.207.242.', '209.207.243.', '209.207.244.', '209.207.245.', '209.207.246.', '209.207.212.', '209.207.223.', '209.207.249.', '209.207.250.', '209.207.247.', '209.207.253.', '209.207.251.', '209.207.252.', '209.207.255.', '209.139.0.', '209.139.2.', '209.139.3.', '209.139.1.', '209.139.5.', '209.207.248.', '209.139.4.', '209.139.6.', '209.139.8.', '209.139.9.', '209.139.10.', '209.139.7.', '209.139.12.', '209.139.13.', '209.139.15.', '209.139.14.', '209.139.16.', '209.139.18.', '209.139.17.', '209.139.19.', '209.139.20.', '209.139.21.', '209.139.22.', '209.139.23.', '209.139.24.', '209.139.25.', '209.139.26.', '209.139.27.', '209.139.28.', '209.139.29.', '209.139.31.', '209.139.30.', '209.139.33.', '209.207.254.', '209.139.34.', '209.139.36.', '209.139.35.', '209.139.37.', '209.139.38.', '209.139.39.', '209.139.40.', '209.139.41.', '209.139.42.', '209.139.43.', '209.139.45.', '209.139.44.', '209.139.11.', '209.139.46.', '209.139.47.', '209.139.48.', '209.139.49.', '209.139.50.', '209.139.51.', '209.139.52.', '209.139.53.', '209.139.55.', '209.139.56.', '209.139.57.', '209.139.58.', '209.139.59.', '209.139.61.', '209.139.32.', '209.139.62.', '209.139.60.', '209.139.64.', '209.139.63.', '209.139.65.', '209.139.67.', '209.139.54.', '209.139.66.', '209.139.70.', '209.139.69.', '209.139.72.', '209.139.73.', '209.139.76.', '209.139.74.', '209.139.75.', '209.139.77.', '209.139.79.', '209.139.81.', '209.139.78.', '209.139.71.', '209.139.82.', '209.139.80.', '209.139.85.', '209.139.84.', '209.139.83.', '209.139.68.', '209.139.88.', '209.139.87.', '209.139.86.', '209.139.90.', '209.139.91.', '209.139.92.', '209.139.93.', '209.139.94.', '209.139.95.', '209.139.96.', '209.139.97.', '209.139.98.', '209.139.100.', '209.139.99.', '209.139.101.', '209.139.103.', '209.139.104.', '209.139.105.', '209.139.106.', '209.139.107.', '209.139.108.', '209.139.109.', '209.139.110.', '209.139.111.', '209.139.112.', '209.139.113.', '209.139.114.', '209.139.115.', '209.139.116.', '209.139.102.', '209.139.117.', '209.139.118.', '209.139.119.', '209.139.120.', '209.139.121.', '209.139.123.', '209.139.122.', '209.139.125.', '209.139.124.', '209.139.126.', '209.139.127.', '209.139.128.', '209.139.129.', '209.139.131.', '209.139.130.', '209.139.132.', '209.139.134.', '209.139.135.', '209.139.136.', '209.139.137.', '209.139.138.', '209.139.139.', '209.139.140.', '209.139.141.', '209.139.142.', '209.139.144.', '209.139.145.', '209.139.146.', '209.139.133.', '209.139.143.', '209.139.147.', '209.139.149.', '209.139.150.', '209.139.151.', '209.139.152.', '209.139.153.', '209.139.154.', '209.139.156.', '209.139.155.', '209.139.158.', '209.139.159.', '209.139.161.', '209.139.162.', '209.139.163.', '209.139.164.', '209.139.165.', '209.139.157.', '209.139.148.', '209.139.167.', '209.139.160.', '209.139.166.', '209.139.168.', '209.139.169.', '209.139.171.', '209.139.170.', '209.139.172.', '209.139.173.', '209.139.175.', '209.139.174.', '209.139.176.', '209.139.178.', '209.139.177.', '209.139.179.', '209.139.180.', '209.139.181.', '209.139.182.', '209.139.183.', '209.139.184.', '209.139.185.', '209.139.189.', '209.139.186.', '209.139.190.', '209.139.188.', '209.139.191.', '209.139.187.', '209.139.89.', '209.24.1.', '207.171.16.' ]; export const getRandomATTIp = () => { const randomSubnet = subnetRanges[Math.floor(Math.random() * subnetRanges.length)]; return `${randomSubnet}${Math.floor(Math.random() * 254) + 1}`; }; export const getRandomIp = () => `66.249.79.${Math.floor(Math.random() * 255)}`; export const getRandomIpRange = () => `${Math.floor(Math.random() * 255) + 1}.${Math.floor( Math.random() * 255 )}.${Math.floor(Math.random() * 255)}.${Math.floor(Math.random() * 255)}`; export const capitalize = (s: string) => s.charAt(0).toUpperCase() + s.slice(1); export const merchantAppIdForStore = (url: string) => { if (/footlocker/i.test(url)) { if (/ca/i.test(url)) { return 'www.footlocker.ca'; } return 'www.footlocker.com'; } if (/footaction/i.test(url)) { return 'www.footaction.com'; } if (/champs/i.test(url)) { return 'www.champssports.com'; } if (/eastbay/i.test(url)) { return 'www.eastbay.com'; } return 'www.footlocker.com'; }; const randomInclusive = (min: number, max: number): number => Math.floor(Math.random() * (max - min + 1)) + min; const toReadableTime = (duration: number) => { let seconds: string | number = Math.floor((duration / 1000) % 60); let minutes: string | number = Math.floor((duration / (1000 * 60)) % 60); let hours: string | number = Math.floor((duration / (1000 * 60 * 60)) % 24); hours = hours < 10 ? `0${hours}` : hours; minutes = minutes < 10 ? `0${minutes}` : minutes; seconds = seconds < 10 ? `0${seconds}` : seconds; return `${hours}:${minutes}:${seconds}`; }; const protections = { Akamai: 'akamai', DataDome: 'datadome', None: 'none' }; export { getDfValue, protections, randomInclusive, toReadableTime, cleanseHeaderData }; ================================================ FILE: app/tasks/footsites/utils/pickVariant.ts ================================================ /* eslint-disable camelcase */ /* eslint-disable no-restricted-syntax */ import { shuffle } from 'lodash'; import { getRandomIntInclusive } from '../../common/utils'; import { Variant } from '../classes/types/variant'; export const sizeMatcherShoe = (sizes: string[]) => (value: string) => { for (const size of sizes) { const pattern = `^${size}(?!.)`; const re = new RegExp(pattern, 'i'); const parsed = `${value}`.replace(/^[^0-9]+/g, ''); if (re.test(parsed)) { return true; } } return false; }; type PickVariant = { variants: Variant[]; sizes: string[]; }; export const pickVariant = ({ variants = [], sizes = [] }: PickVariant): null | Variant => { const matches: Variant[] = []; const variantGroup = [...variants] .map(({ id, sku, size, price, available }) => { // remove leading 0 (e.g. - `08.0 => 8.0`) let s = size?.replace(/^0+/, ''); // remove trailing .0 (e.g. - `8.0 => 8`) if (s?.endsWith('.0')) { s = s.slice(0, -2); } return { id, sku, price, available, size: s }; }) .filter(Boolean); // let's just choose a random in stock variant if they just chose random sizing // this will at least guarantee they checkout if there is a size available if (sizes.length === 1 && sizes.some(size => /random/i.test(size))) { const inStockOptions = variantGroup.filter(({ available }) => available); // no variations in stock, let's return a random size.. if (!inStockOptions.length) { const rand = getRandomIntInclusive(0, variantGroup.length - 1); const variant = variantGroup[rand]; return variant; } // let's return a random option from the instock list const rand = getRandomIntInclusive(0, inStockOptions.length - 1); const variant = inStockOptions[rand]; return variant; } for (const variant of variantGroup) { // Determine if we are checking for shoe sizes or not let sizeMatcher; if (sizes.some(size => /[0-9]+/.test(size))) { // We are matching a shoe size sizeMatcher = sizeMatcherShoe(sizes); } else { // We are matching a garment size sizeMatcher = (s: string) => sizes.some( size => !/[0-9]+/.test(s) && new RegExp(`^${size}`, 'i').test(`${s}`.trim()) ); } if (sizeMatcher(variant.size)) { matches.push(variant); } } // if we can't match a size at all and we don't want random, return null if (!matches.length && !sizes.some(size => /random/i.test(size))) { return null; } // if we only matched one variant, just use that no matter what if (matches.length === 1) { return matches[0]; } // otherwise, let's do some 'pseudo-random' shuffling const options = shuffle([...matches]); const inStockOptions = options.filter(({ available }) => available); if (!inStockOptions.length) { const rand = getRandomIntInclusive(0, matches.length - 1); const variant = matches[rand]; return variant; } const rand = getRandomIntInclusive(0, inStockOptions.length - 1); const variant = inStockOptions[rand]; return variant; }; ================================================ FILE: app/tasks/index.ts ================================================ import { TaskManager } from './managers'; import { Task, Manager } from './common/constants'; const { Types: TaskTypes } = Task; const { Events } = Manager; export { TaskManager, Events, TaskTypes }; ================================================ FILE: app/tasks/managers/analytics.ts ================================================ import { ipcMain } from 'electron'; import { parse } from 'json2csv'; import { stat } from 'fs'; import { appendFileSync, writeFileSync } from 'fs-extra'; import { IPCKeys } from '../../constants/ipc'; type Data = { success: boolean; store: string; date: string; order: string; product: string; price: string; size: string; name: string; email: string; card: string; proxy: string; }; export class AnalyticsManager { file: string; newLine: string; fields: string[]; constructor() { this.file = ''; this.newLine = '\r\n'; this.fields = [ 'success', 'store', 'date', 'order', 'product', 'price', 'size', 'name', 'email', 'card', 'proxy' ]; ipcMain.on(IPCKeys.AddAnalyticsFile, (_, file) => { this.file = file; }); ipcMain.on(IPCKeys.RemoveAnalyticsFile, () => { this.file = ''; }); } log = ({ success, store, date, order, product, price, size, name, email, card, proxy }: Data) => { if (this.file) { try { stat(this.file, (err: any) => { if (err == null) { // write the actual data and end with newline const csv = parse( { success, store, date, order, product, price, size, name, email, card, proxy }, { fields: this.fields, header: false } ) + this.newLine; return appendFileSync(this.file, csv); } const csv = parse( { success, store, date, order, product, price, size, name, email, card, proxy }, { fields: this.fields } ) + this.newLine; writeFileSync(this.file, csv); }); } catch (err) { console.error(err); } } }; } ================================================ FILE: app/tasks/managers/browser/index.ts ================================================ import { session, BrowserWindow } from 'electron'; import { readFileSync } from 'fs'; import qs from 'query-string'; import { PATHS } from '../../../utils/paths'; export type SessionRequester = { id: string; completed: any | null; data: any; active: boolean; }; export const intercept = (url: string, window: BrowserWindow) => { window.webContents.session.protocol.interceptBufferProtocol( 'https', (req: any, callback: any) => { if (req.url === url) { const html = readFileSync(PATHS.three3dsPath, 'utf8'); window.webContents.session.protocol.uninterceptProtocol('https'); return callback({ mimeType: 'text/html', data: Buffer.from(html) }); } return callback(); } ); }; export class BrowserManager { requesters: { [id: string]: SessionRequester; }; browsers: { [id: string]: BrowserWindow; }; constructor() { this.requesters = {}; this.browsers = {}; } count = () => Object.values(this.requesters).filter(({ active }) => active).length; insert = ({ id, data }: SessionRequester) => { this.requesters[id] = { id, data, completed: false, active: false }; }; remove = ({ id }: { id: string }) => { if (this.requesters[id]) { if (this.browsers[id]) { this.browsers[id].close(); delete this.browsers[id]; } delete this.requesters[id]; } }; launch = async ({ id, session: _session, url, proxy, userAgent, form, termUrl }: any) => { const window = new BrowserWindow({ center: true, transparent: false, fullscreenable: false, movable: true, title: 'Yeezy Supply - 3DSecure', show: true, width: 450, height: 600, frame: true, resizable: true, webPreferences: { backgroundThrottling: true, session: _session || session.defaultSession } }); window.webContents.on('login', (_, __, authInfo, cb) => { if (authInfo.isProxy) { const [username, password] = proxy .split('@')[0] .split('http://')[1] .split(':'); cb(username, password); } }); window.webContents.userAgent = userAgent; window.on('close', () => { this.requesters[id].active = false; delete this.browsers[id]; }); window.webContents.session.webRequest.onBeforeRequest( { urls: [termUrl] }, (details, cb) => { window.webContents.session.webRequest.onBeforeRequest( { urls: [termUrl] }, null ); window.close(); this.requesters[id].data = { data: qs.parse(details.uploadData[0].bytes.toString()), orderId: form.orderId, paymentUrl: `${url}/api/checkout/payment-verification/${form.formFields.EncodedData}`, termUrl }; this.requesters[id].completed = true; this.requesters[id].active = false; cb({ cancel: true }); } ); this.browsers[id] = window; const threeDSecureHtml = ` `; window.loadURL(`data:text/html,${encodeURIComponent(threeDSecureHtml)}`); }; } ================================================ FILE: app/tasks/managers/cache/cache.ts ================================================ import { BrowserWindow, ipcMain, IpcMainInvokeEvent } from 'electron'; import { IPCKeys } from '../../../constants/ipc'; import { createCacheWindow, WindowStates } from './windows'; import { PATHS } from '../../../utils/paths'; type Products = { [id: string]: any; }; type Window = { id: number; window: BrowserWindow | null; state: string; }; export class CacheManager { mainWindow: BrowserWindow | null; window: Window; products: Products; constructor(mainWindow: BrowserWindow | null) { this.mainWindow = mainWindow; this.window = { id: 0, state: WindowStates.CLOSE, window: null }; this.products = {}; ipcMain.handle(IPCKeys.LaunchCacheWindow, this.launch); } launch = (_: IpcMainInvokeEvent) => { if (this.window.window) { const { window } = this.window; window.show(); window.focus(); return; } this.window.state = WindowStates.LOAD; const window = createCacheWindow(); this.window.window = window; this.window.id = window.id; window.loadURL(`${PATHS.cacheUrlPath}`); window.once('ready-to-show', () => { window.show(); this.window.state = WindowStates.READY; }); }; } ================================================ FILE: app/tasks/managers/cache/windows.ts ================================================ import { BrowserWindow } from 'electron'; export const createCacheWindow = () => { return new BrowserWindow({ backgroundColor: '#202126', center: true, fullscreenable: false, movable: true, show: false, width: 800, height: 800, frame: false, transparent: true, resizable: true, webPreferences: { webSecurity: true, nodeIntegration: true, backgroundThrottling: true } }); }; export const WindowStates = { LOAD: 'load', READY: 'ready', SOLVING: 'solving', CLOSE: 'close' }; ================================================ FILE: app/tasks/managers/captcha/autoSolve.ts ================================================ import { Platforms } from '../../../constants'; import CAPTCHA_TYPES from '../../../utils/captchaTypes'; export const versionForType = (type: string) => { switch (type) { default: case CAPTCHA_TYPES.RECAPTCHA_V2: case CAPTCHA_TYPES.RECAPTCHA_V2C: return 0; // v2 checkbox case CAPTCHA_TYPES.RECAPTCHA_V2I: return 1; // v2 invisible case CAPTCHA_TYPES.RECAPTCHA_V3: return 2; // v3 / enterprise } }; export const requestAutoSolve = async ({ autoSolve, id, platform, url, proxy, siteKey, version, action, renderParameters }: AutoSolveProps) => { if (proxy) { return autoSolve.sendTokenRequest({ taskId: `${id}::${platform}`, url, siteKey, version, proxy, proxyRequired: platform === Platforms.Shopify, // NOTE: To prevent Cap Monster cancels action, renderParameters }); } return autoSolve.sendTokenRequest({ taskId: `${id}::${platform}`, url, siteKey, version, proxyRequired: false, action, renderParameters }); }; export const cancelAutoSolve = async ({ id, platform, autoSolve }: { id: string; platform: string; autoSolve: any; }) => { try { await autoSolve.cancelTokenRequest(`${id}::${platform}`); } catch (err) { // TODO: Proper error handling } }; type PlatformForUrl = { [url: string]: string; }; export const platformForUrl: PlatformForUrl = { 'https://checkout.shopify.com': Platforms.Shopify, 'https://www.supremenewyork.com': Platforms.Supreme, 'https://www.yeezysupply.com': Platforms.YeezySupply, 'https://geo.captcha-delivery.com/': Platforms.Footsites, 'https://geo.captcha-delivery.com?pokemon': Platforms.Pokemon }; ================================================ FILE: app/tasks/managers/captcha/captcha.ts ================================================ /* eslint-disable no-restricted-syntax */ import { session, BrowserWindow, ipcMain, IpcMainInvokeEvent, AuthenticationResponseDetails, AuthInfo, IpcMainEvent, Cookie } from 'electron'; import uuid from 'uuid'; import AutoSolve from 'autosolve-client'; import { isEmpty } from 'lodash'; import captchaTypes from '../../../utils/captchaTypes'; import { Platforms } from '../../../constants'; import { requestAutoSolve, cancelAutoSolve, versionForType } from './autoSolve'; import { loadGoogle, loadHost, sleep, intercept, setProxy, HarvestStates, WindowStates, attachRequester, detachRequester } from '../utils'; import { createCaptchaWindow, closeAll } from './windows'; import { IPCKeys } from '../../../constants/ipc'; import { Youtube } from './youtube'; import { format } from '../../../utils/proxy'; import { NotificationManager } from '..'; type AutoSolveProps = { apiKey: string; accessToken: string; }; type CaptchaDetailProps = { id: string; name: string; store: string; proxy: string; type: string; platform: string; theme: number; }; export type CaptchaProps = { id: string; // frontend ID guid: string; // backend ID name: string; // frontend name proxy?: string; // frontend proxy lastUsed: number; state: string; host: string; type: string; platform: string; theme: number; task: null | string; // currently solving task id window: BrowserWindow; }; export type InterceptProps = { listener: any; window: BrowserWindow; id: string; guid: string; platform: string; store: string; name: string; proxy?: string; type: string; theme: number; }; export type CaptchaWindow = { [id: string]: CaptchaProps; }; export type CaptchaWindows = { [platform: string]: CaptchaWindow; }; export type CaptchaRequester = { id: string; type: string; initialCid?: string; hash?: string; cid?: string; t?: string; sitekey: string; platform: string; host: string; state?: string; // state of the requester harvest: ({ token, form, body, cookies, timestamp }: { token?: string; form?: string; body?: string; cookies?: Cookie[]; timestamp?: number; }) => void; userAgent?: string; checkpoint?: boolean; // shopify proxy?: string; // currently only used for shopify s?: string; // shopify cookies?: Cookie[]; action?: string; // yeezysupply sharing?: boolean; // yeezysupply expiration?: number; // yeezysupply }; export type CaptchaRequesters = { [platform: string]: { [id: string]: CaptchaRequester; }; }; type CaptchaIntervals = { [platform: string]: number; }; type TokenQueue = { [platform: string]: { id: string; token: string; timestamp: number; }; }; export class CaptchaManager { mainWindow: BrowserWindow | null; notificationManager: NotificationManager; windows: CaptchaWindows; requesters: CaptchaRequesters; intervals: CaptchaIntervals; intervalRate: number; autoSolve: AutoSolve | null; youtubeManager: Youtube; tokens: TokenQueue; captchaSemaphore: string; constructor( mainWindow: BrowserWindow | null, notificationManager: NotificationManager ) { this.mainWindow = mainWindow; this.notificationManager = notificationManager; this.windows = {}; this.requesters = {}; this.intervals = {}; this.intervalRate = 250; // .25 of a second poll for new requesters this.autoSolve = null; this.tokens = {}; this.youtubeManager = new Youtube(mainWindow, this); this.captchaSemaphore = ''; // handlers ipcMain.handle(IPCKeys.SetupAutoSolve, this.setupAutoSolve); ipcMain.handle(IPCKeys.LaunchHarvester, this.launch); ipcMain.handle(IPCKeys.CancelLaunchHarvester, this.cancel); ipcMain.handle(IPCKeys.CloseHarvesterWindows, this.close); ipcMain.on(IPCKeys.UpdateHarvester, this.update); ipcMain.on(IPCKeys.UpdateHCaptchaToken, this.saveHcaptchaToken); ipcMain.on(IPCKeys.UpdateTheme, this.theme); ipcMain.on(IPCKeys.HarvestCaptcha, this.harvest); } /** * Sends solve requests for idle requesters to idle windows * @param platform - Platform to check solve requests for */ startInterval = (platform: string) => { return setInterval(async () => { const requesters = Object.values(this.requesters[platform]).filter( ({ state }) => state === HarvestStates.IDLE || state === HarvestStates.AUTOSOLVE ); // eslint-disable-next-line no-restricted-syntax for (const requester of requesters) { const { id, type, host, sitekey, platform, proxy, state, s, action } = requester; if (!this.windows[platform]) { this.windows[platform] = {}; } const queue = Object.values(this.windows[platform]) .filter( ({ state, task, type: _type }) => state === WindowStates.READY && !task && (platform !== Platforms.Shopify || (platform === Platforms.Shopify && ((_type === 'Checkout' && type === captchaTypes.RECAPTCHA_V2) || (_type === 'Checkpoint' && type === captchaTypes.RECAPTCHA_V2C) || (_type === 'Login' && type === captchaTypes.RECAPTCHA_V3)))) ) .sort((a, b) => (a.lastUsed > b.lastUsed ? 1 : -1)); const window = (queue || [])[0]; if (window) { window.lastUsed = Date.now(); } const version = versionForType(type); if (this.autoSolve && state !== HarvestStates.AUTOSOLVE) { requester.state = HarvestStates.AUTOSOLVE; const renderParameters = s ? { s } : {}; if (platform === Platforms.YeezySupply) { if (!this.captchaSemaphore) { this.captchaSemaphore = id; } requestAutoSolve({ autoSolve: this.autoSolve, id, platform, siteKey: sitekey, version: `${version}`, action, proxy, renderParameters, url: host }); } else { requestAutoSolve({ autoSolve: this.autoSolve, id, platform, siteKey: sitekey, version: `${version}`, action, proxy, renderParameters, url: host }); } } if (window) { window.state = WindowStates.SOLVING; requester.state = HarvestStates.START; attachRequester({ entry: window, version, requester, window: window.window, isCheckpoint: window.type === 'Checkpoint', needsFocus: this.mainWindow?.isFocused() || false, remove: this.remove }); } } }, this.intervalRate); }; stopInterval = (platform: string) => { clearInterval(this.intervals[platform]); delete this.intervals[platform]; }; /** * Attaches event listeners to the browser object to * help provide basic harvester functionality. * * @param window - BrowserWindow to attach to */ attachHandlers = (guid: string, window: BrowserWindow, platform: string) => { window.hide(); // remove the window from list of windows before closing window.on('close', () => { this.windows[platform][guid].state = WindowStates.CLOSE; const { task } = this.windows[platform][guid]; // if we had a requester while closing, unassign it from the window if (task) { const requester = this.requesters[platform][task]; if (requester) { requester.state = HarvestStates.IDLE; } } delete this.windows[platform][guid]; }); const authHandler = ( event: Event, _: AuthenticationResponseDetails, authInfo: AuthInfo, callback: Function ) => { event.preventDefault(); const { proxy } = this.windows[platform][guid]; if (authInfo.isProxy && proxy) { const formatted = format(proxy); if (formatted) { const [, , username, password] = formatted; callback(username, password); } } }; // handle proxy authentication for this window window.webContents.on('login', authHandler); }; /** * Inserts a requester into it's respective mapping by platform * * Note: This method also kicks off the requester interval if it * wasn't start already. */ insert = async ({ id, type, initialCid, hash, cid, sitekey, platform, harvest, host, proxy, t, s, userAgent, cookies, action, sharing, expiration, state = HarvestStates.IDLE }: CaptchaRequester) => { // if we're sharing, return the token if (sharing && this.tokens[platform]) { const { timestamp, token } = this.tokens[platform]; return harvest({ token, timestamp }); } // or if the stored token corresponds to the same task, return it if (this.tokens[platform] && this.tokens[platform].id === id) { const { timestamp, token } = this.tokens[platform]; return harvest({ token, timestamp }); } if (this.autoSolve) { this.notificationManager.insert({ id, message: `Task ${id}: Sent to AutoSolve`, variant: 'info' }); } this.notificationManager.insert({ id, message: `Task ${id}: ${type}`, variant: 'warning', type: 'HEADS_UP' }); if (!this.requesters[platform]) { this.requesters[platform] = {}; } if (this.requesters[platform][id]) { return; } this.requesters[platform][id] = { id, type, initialCid, hash, cid, t, sitekey, platform, harvest, host, state, proxy, cookies, userAgent, s, action, sharing, expiration }; if (!this.intervals[platform]) { this.intervals[platform] = this.startInterval(platform); } return null; }; /** * Removes a requester from the mapping of requesters and assignment * to any captcha windows * * Note: This method will also stop the requester interval if there * aren't anymore requesters for that platform. */ remove = async ({ id, platform }: { id: string; platform: string }) => { if (!this.requesters[platform]) { return; } delete this.requesters[platform][id]; if (this.autoSolve) { cancelAutoSolve({ id, platform, autoSolve: this.autoSolve }); } const windows = Object.values(this.windows[platform]); // eslint-disable-next-line no-restricted-syntax for (const entry of windows) { if (entry.task === id) { detachRequester({ requesters: this.requesters, platform, entry }); break; } } // focus next window const nextToFocus = windows.find(({ task }) => task); if (nextToFocus && !nextToFocus.window.isFocused()) { nextToFocus.window.show(); nextToFocus.window.focus(); } if (isEmpty(this.requesters[platform])) { this.stopInterval(platform); } }; /** * Handles harvesting the captcha token and sending it to the proper task */ harvest = async ( _: IpcMainEvent | null, // null if called from AutoSolve { id, platform, token, timestamp }: { id: string; platform: string; token: string; timestamp: number; } ) => { if (!this.requesters[platform]) { return; } const { sharing } = this.requesters[platform][id]; // store the token in the token cache if (platform === Platforms.YeezySupply) { this.tokens[platform] = { id, token, timestamp }; // remove the token in (expiration || 115s) setTimeout(() => { if (this.captchaSemaphore) { this.captchaSemaphore = ''; } delete this.tokens[platform]; }, 110000); } // if we're sharing tokens, let's harvest for all shared requesters.. if (sharing) { return Promise.all( Object.values(this.requesters[platform]).map( (requester: CaptchaRequester) => { if (requester.sharing) { requester.harvest({ token, timestamp }); if (this.autoSolve && requester.id === this.captchaSemaphore) { return this.remove({ id: requester.id, platform }); } return this.remove({ id: requester.id, platform }); } return null; } ) ); } const requester = this.requesters[platform][id]; requester.harvest({ token, timestamp }); return this.remove({ id, platform }); }; cancel = async (_: IpcMainInvokeEvent, { id }: CaptchaDetailProps) => { for (const platform of Object.keys(this.windows)) { if (!this.windows[platform]) { this.windows[platform] = {}; } for (const window of Object.values(this.windows[platform])) { const { id: _id, guid, window: _window, state } = window; if (_id === id && state === WindowStates.LOAD) { _window.close(); delete this.windows[platform][guid]; } } } return true; }; /** * Launches a captcha window and stores it in the map of windows */ launch = async ( _: IpcMainInvokeEvent, { id, name, store, proxy, type, platform, theme }: CaptchaDetailProps ) => { if (!this.windows[platform]) { this.windows[platform] = {}; } // make sure we close the youtube window associated with the harvester const youtube = this.youtubeManager.windows[id]; if (youtube) { youtube.window.close(); } const guid = uuid(); const window = createCaptchaWindow(id, theme, type); this.windows[platform][guid] = { id, guid, name, host: store, platform, lastUsed: 0, state: WindowStates.LOAD, task: null, theme, type, window, proxy }; this.attachHandlers(guid, window, platform); await setProxy({ window, proxy }); const listener = (_: any, __: any, errorDescription: string) => { this.notificationManager.notify({ message: `Failed to load harvester [${errorDescription}]`, variant: 'error', force: true }); return window.close(); }; window.webContents.once('did-fail-load', listener); await loadGoogle(window); await sleep(Math.floor(Math.random() * 1750) + 1250); return this.intercept({ listener, window, id, guid, platform, store, name, proxy, type, theme }); }; intercept = async ({ listener, window, guid, platform, store, name, type, theme }: InterceptProps) => { // intercept and load the proper host finally.. intercept(window); await loadHost(window, store); window.webContents.send(IPCKeys.HarvesterData, { name, type, platform, theme }); window.show(); window.webContents.removeListener('did-fail-load', listener); this.windows[platform][guid].state = WindowStates.READY; return true; }; /** * Invoked by a user deleting the harvester from the frontend. * This method will close either A) the harvester window, or B) * the Youtube window (whichever is open at the time). */ close = async (_: IpcMainInvokeEvent, { id }: CaptchaDetailProps) => { const youtube = this.youtubeManager.windows[id]; if (youtube) { const { window } = youtube; window.close(); } for (const platform of Object.keys(this.windows)) { if (!this.windows[platform]) { this.windows[platform] = {}; } for (const window of Object.values(this.windows[platform])) { if (window.id === id) { window.window.close(); } } } return true; }; closeAllWindows = () => { return Promise.all( Object.values(this.windows).map(windows => closeAll(Object.values(windows)) ) ); }; theme = async (_: IpcMainEvent, { theme }: CaptchaDetailProps) => { for (const platform of Object.keys(this.windows)) { if (!this.windows[platform]) { this.windows[platform] = {}; } for (const window of Object.values(this.windows[platform])) { window.window.webContents.send(IPCKeys.HarvesterData, { theme }); } } return true; }; /** * Updates a previously launched harvester with new information */ update = async ( _: IpcMainEvent, { id, name, proxy, type, theme }: CaptchaDetailProps ) => { for (const platform of Object.keys(this.windows)) { if (!this.windows[platform]) { this.windows[platform] = {}; } for (const window of Object.values(this.windows[platform])) { if (window.id === id) { if (window.proxy !== proxy) { // eslint-disable-next-line no-await-in-loop await setProxy({ window: window.window, proxy }); } this.windows[platform][id] = { ...window, id, name, proxy, lastUsed: Date.now(), type }; window.window.webContents.send(IPCKeys.HarvesterData, { name, type, theme }); } } } return true; }; saveHcaptchaToken = async ( _: IpcMainEvent, { id, token }: { id: string; token: string } ) => { const sess = session.fromPartition(`persist:${id}`); if (!token) { return sess.cookies.remove( 'https://www.hcaptcha.com', 'hc_accessibility' ); } return sess.cookies.set({ url: 'https://www.hcaptcha.com', domain: '.hcaptcha.com', name: 'hc_accessibility', value: token, secure: true }); }; /** * Allows you to swap to and from autosolve / bot solvers */ unassignRequesters = (autoSolve = false) => { // eslint-disable-next-line no-restricted-syntax for (const platform of Object.keys(this.requesters)) { // eslint-disable-next-line no-restricted-syntax for (const requester of Object.values(this.requesters[platform])) { if (!autoSolve) { if (requester.state === HarvestStates.AUTOSOLVE) { requester.state = HarvestStates.IDLE; } } else if (requester.state === HarvestStates.START) { requester.state = HarvestStates.IDLE; const window = Object.values(this.windows[requester.platform]).find( ({ task }) => task === requester.id ); if (window) { detachRequester({ requesters: this.requesters, platform, entry: window }); } } } } }; setupAutoSolve = async ( _: IpcMainInvokeEvent, { apiKey, accessToken }: AutoSolveProps ) => { if (!apiKey || !accessToken) { if (this.autoSolve) { this.autoSolve.cancelAllRequests(); this.autoSolve = null; } this.unassignRequesters(); return { success: false }; } this.autoSolve = AutoSolve.getInstance({ accessToken, apiKey, clientKey: '', shouldAlertOnCancel: true, debug: true }); if (!this.autoSolve) { this.autoSolve = null; return { success: false }; } return this.autoSolve .init() .then(() => { if (this.autoSolve) { this.unassignRequesters(true); this.autoSolve.ee.on( `AutoSolveResponse`, async (data: AutoSolveResponseProps) => { const { taskId, token, createdAt } = JSON.parse(data); const [id, platform] = taskId.split('::'); this.harvest(null, { id, platform, timestamp: Math.floor((createdAt * 1000 + 120000) / 1000), token }); } ); } return { success: true }; }) .catch((error: string) => { this.autoSolve = null; if (typeof error === 'string') { return { error }; } return { error: 'Unknown AutoSolve Error' }; }); }; } ================================================ FILE: app/tasks/managers/captcha/windows.ts ================================================ import { BrowserWindow, session } from 'electron'; import { join } from 'path'; import { IS_DEV } from '../../../constants/env'; import { PATHS } from '../../../utils/paths'; export const createYoutubeWindow = (id: string) => { return new BrowserWindow({ center: true, transparent: false, fullscreenable: false, movable: true, show: false, width: 450, height: 600, frame: true, resizable: true, webPreferences: { webSecurity: true, devTools: IS_DEV, nodeIntegration: false, backgroundThrottling: true, session: session.fromPartition(`persist:${id}`) } }); }; export const createCaptchaWindow = ( id: string, theme: number, type: string ) => { const preload = IS_DEV ? join(PATHS.preload, 'harvester.js') : join(__dirname, 'dist/harvester.prod.js'); return new BrowserWindow({ backgroundColor: theme === 0 ? '#f4f4f4' : '#202126', width: 400, height: 555, minWidth: 400, minHeight: 555, resizable: true, fullscreenable: false, useContentSize: true, show: false, transparent: type !== 'Checkpoint', frame: type === 'Checkpoint', titleBarStyle: 'default', acceptFirstMouse: true, webPreferences: { contextIsolation: false, backgroundThrottling: true, devTools: IS_DEV, webSecurity: false, plugins: true, session: session.fromPartition(`persist:${id}`), preload } }); }; export const closeAll = async (windows: any[]) => { return Promise.all(windows.map(({ window }) => window?.close())); }; ================================================ FILE: app/tasks/managers/captcha/youtube.ts ================================================ import { BrowserWindow, IpcMainInvokeEvent, ipcMain, AuthInfo, AuthenticationResponseDetails } from 'electron'; import { IPCKeys } from '../../../constants/ipc'; import { createYoutubeWindow, closeAll } from './windows'; import { setProxy, loadHost } from '../utils'; import { format } from '../../../utils/proxy'; import { CaptchaManager } from './captcha'; export type YoutubeWindow = { id: string; // frontend ID proxy?: string; // frontend proxy window: BrowserWindow; }; export type YoutubeWindows = { [id: string]: YoutubeWindow; }; type LaunchProps = { id: string; platform: string; proxy?: string; }; export class Youtube { mainWindow: BrowserWindow | null; captchaManager: CaptchaManager; windows: YoutubeWindows; constructor( mainWindow: BrowserWindow | null, captchaManager: CaptchaManager ) { this.mainWindow = mainWindow; this.captchaManager = captchaManager; this.windows = {}; ipcMain.handle(IPCKeys.LaunchYoutube, this.launch); ipcMain.handle(IPCKeys.CancelLaunchYouTube, this.cancel); } /** * Attaches event listeners to the browser object to * help provide basic harvester functionality. * * @param window - BrowserWindow to attach to */ attachHandlers = (id: string, window: BrowserWindow) => { // remove the window from list of windows before closing window.on('close', () => { delete this.windows[id]; }); const authHandler = ( event: Event, _: AuthenticationResponseDetails, authInfo: AuthInfo, callback: Function ) => { event.preventDefault(); const { proxy } = this.windows[id]; if (authInfo.isProxy && proxy) { const formatted = format(proxy); if (formatted) { const [, , username, password] = formatted; callback(username, password); } } }; // handle proxy authentication for this window window.webContents.on('login', authHandler); }; closeAllWindows = () => closeAll(Object.values(this.windows)); cancel = async (_: IpcMainInvokeEvent, { id }: LaunchProps) => { const launched = this.windows[id]; if (launched) { launched.window.close(); delete this.windows[id]; } return true; }; launch = async ( _: IpcMainInvokeEvent, { id, platform, proxy }: LaunchProps ) => { if (this.captchaManager.windows[platform]) { const captcha = this.captchaManager.windows[platform][id]; if (captcha) { const { window } = captcha; window.close(); } } const launched = this.windows[id]; if (launched) { launched.window.show(); launched.window.focus(); return; } const window = createYoutubeWindow(id); this.windows[id] = { id, proxy, window }; this.attachHandlers(id, window); await setProxy({ window, proxy }); const listener = (_: any, __: any, errorDescription: string) => { this.captchaManager.notificationManager.notify({ message: `Failed to load YouTube [${errorDescription}]`, variant: 'error', force: true }); return window.close(); }; window.webContents.once('did-fail-load', listener); await loadHost( window, 'https://accounts.google.com/signin/v2/identifier?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3D%252F&hl=en&ec=65620&flowName=GlifWebSignIn&flowEntry=ServiceLogin', { userAgent: 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0' } ); window.webContents.removeListener('did-fail-load', listener); window.show(); return true; }; } ================================================ FILE: app/tasks/managers/checkout.ts ================================================ import { emitEvent } from '../common/utils'; /* eslint-disable no-restricted-syntax */ export type DataRequester = { context: any; abort?: () => void; }; export class CheckoutManager { requesters: { [url: string]: { [taskId: string]: DataRequester; }; }; constructor() { this.requesters = {}; } check = ({ context }: DataRequester) => { const { id, task: { profile: { id: profileId }, store: { url } } } = context; if (!this.requesters[url]) { this.requesters[url] = {}; } for (const { context: _context, abort } of Object.values( this.requesters[url] )) { const { id: _id, task: { profile: { id: _profileId } } } = _context; // TODO: Refine this more... if (profileId === _profileId && _id !== id) { emitEvent(_context, [_id], { message: 'Profile already used' }); if (abort) { abort(); } } } }; insert = ({ context, abort }: DataRequester) => { const { id, task: { store: { url } } } = context; if (!this.requesters[url]) { this.requesters[url] = {}; } this.requesters[url][id] = { context, abort }; }; remove = ({ context }: DataRequester) => { const { id, task: { store: { url } } } = context; if (!this.requesters[url]) { this.requesters[url] = {}; } if (this.requesters[url][id]) { delete this.requesters[url][id]; } }; } ================================================ FILE: app/tasks/managers/checkpoint/index.tsx ================================================ import { session, Session } from 'electron'; import { Utils } from '../../common'; const { userAgent, request } = Utils; export class CheckpointManager { interval: number | null; intervalRate: number; requesters: { [url: string]: number; }; session: Session; cache: any; constructor() { this.interval = null; this.intervalRate = 5000; this.requesters = {}; this.session = session.fromPartition('persist:checkpoint'); this.cache = {}; } check = async (url: string) => { try { const { body } = await request(this.session, { url: `${url}/checkpoint`, headers: { accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'en-US,en;q=0.9', 'cache-control': 'no-cache', pragma: 'no-cache', 'user-agent': userAgent, origin: url } }); // return true; return /content_checkpoint/i.test(body); } catch (err) { return false; } }; isLive = (url: string) => this.cache[url] || false; start = async (url: string) => { if (typeof this.cache[url] === 'undefined') { this.cache[url] = false; } if (typeof this.requesters[url] === 'undefined') { this.requesters[url] = 1; } if (!this.interval) { this.interval = setInterval(async () => { const isLive = await this.check(url); this.cache[url] = isLive; }, this.intervalRate); const isLive = await this.check(url); this.cache[url] = isLive; } }; stop = (url: string) => { this.requesters[url] -= 1; if (this.requesters[url] < 0) { this.requesters[url] = 0; } if (this.requesters[url] === 0) { if (this.interval) { clearInterval(this.interval); this.interval = null; } } }; } ================================================ FILE: app/tasks/managers/geetest/index.ts ================================================ import { DatadomeData } from '../../footsites/classes/types'; export type SessionRequester = { id: string; url: string; data: DatadomeData; release: (cookie?: string) => void; active: boolean; }; export class GeetestManager { requesters: { [url: string]: { [id: string]: SessionRequester; }; }; constructor() { this.requesters = {}; } count = (url: string) => { if (!this.requesters[url]) { this.requesters[url] = {}; } return Object.values(this.requesters[url]).filter(({ active }) => active) .length; }; insert = ({ id, url, data, release, active }: SessionRequester) => { if (!this.requesters[url]) { this.requesters[url] = {}; } this.requesters[url][id] = { id, url, data, release, active }; }; get = (url: string, id: string) => { if (!this.requesters[url]) { this.requesters[url] = {}; } return this.requesters[url][id]; }; // swaps an active solver with an inactive solver swap = (url: string, id: string) => { if (!this.requesters[url]) { this.requesters[url] = {}; } this.requesters[url][id].active = false; // eslint-disable-next-line no-restricted-syntax for (const { id: _id, data, release } of Object.values( this.requesters[url] )) { if (id !== _id && data.t !== 'bv') { // set old requester to inactive this.requesters[url][_id].active = true; release(); break; } } }; spread = (url: string, cookie: string) => { if (!this.requesters[url]) { this.requesters[url] = {}; } // eslint-disable-next-line no-restricted-syntax for (const { id: _id, release } of Object.values(this.requesters[url])) { if (!this.requesters[url]) { this.requesters[url] = {}; } delete this.requesters[url][_id]; release(cookie); } }; remove = ({ id, url }: { id: string; url: string }) => { if (!this.requesters[url]) { this.requesters[url] = {}; } delete this.requesters[url][id]; }; } ================================================ FILE: app/tasks/managers/index.ts ================================================ import { TaskManager } from './tasks'; import { CaptchaManager } from './captcha/captcha'; import { ProxyManager } from './proxy'; import { WebhookManager } from './webhook'; import { ProfileManager } from './profile/profile'; import { NotificationManager } from './notification'; import { RestartManager } from './restart'; import { CheckoutManager } from './checkout'; import { GeetestManager } from './geetest'; import { AnalyticsManager } from './analytics'; import { BrowserManager } from './browser'; import { InterceptionManager } from './interception'; import { CheckpointManager } from './checkpoint'; import { QueueManager } from './queue'; export { TaskManager, CaptchaManager, ProxyManager, WebhookManager, ProfileManager, NotificationManager, RestartManager, CheckoutManager, AnalyticsManager, BrowserManager, QueueManager, GeetestManager, InterceptionManager, CheckpointManager }; ================================================ FILE: app/tasks/managers/interception/index.ts ================================================ import { BrowserWindow, session } from 'electron'; import { isEmpty } from 'lodash'; import { intercept, loadHost } from '../utils'; import { createInterceptionWindow } from './window'; export class InterceptionManager { requesters: any; window: BrowserWindow; active: boolean; constructor() { this.requesters = {}; this.window = null; this.active = false; } insert({ id, html }: { id: string; html: string }) { this.requesters[id] = { id, html }; if (!this.window) { this.window = createInterceptionWindow(id); } if (!this.active) { // lets render the html, hopefully we dont need to use iframe this.active = true; } } intercept = async ({ window, url }: { window: BrowserWindow; url: string; }) => { // intercept and load the proper host finally.. intercept(window); return loadHost(window, new URL(url).hostname); }; /** * * @param id task id * @param urlFilter array of urls to match. see webRequest.onCompleted options for more details. */ async interceptResponse({ id, urlFilter }: { id: string; urlFilter: string[]; }) { if (!this.window) { return undefined; } const windowSession = session.fromPartition(`persist:${id}`); return new Promise(resolve => { windowSession.webRequest.onCompleted( { urls: urlFilter }, ({ statusCode, responseHeaders }) => { resolve({ statusCode, responseHeaders }); } ); }); } // make sure to call remove in task after the desired intercepted response is achieved remove(id: string) { if (this.requesters[id]) { delete this.requesters[id]; } // lets remove the html if (isEmpty(this.requesters)) { this.window.close(); this.window = null; this.active = false; } } } ================================================ FILE: app/tasks/managers/interception/window.ts ================================================ import { BrowserWindow } from 'electron'; export const createInterceptionWindow = (id: string) => { return new BrowserWindow({ center: true, fullscreenable: false, movable: true, show: false, width: 600, height: 800, frame: false, transparent: true, resizable: true, webPreferences: { nodeIntegration: false, backgroundThrottling: true, webSecurity: true, partition: `persist:${id}` } }); }; ================================================ FILE: app/tasks/managers/notification.ts ================================================ import { BrowserWindow } from 'electron'; import { isEmpty } from 'lodash'; import { IPCKeys } from '../../constants/ipc'; type Notification = { id?: string; message: string; variant: string; type?: string; force?: boolean; }; export class NotificationManager { notification: any; mainWindow: BrowserWindow | null; constructor(mainWindow: BrowserWindow | null) { this.notification = {}; this.mainWindow = mainWindow; } notify = (notification: Notification) => { // send IPC to frontend to make the notification if (this.mainWindow) { this.mainWindow.webContents.send(IPCKeys.Notification, notification); } }; insert = (notification: Notification) => { // if we already have a notification in the queue, return if (!isEmpty(this.notification)) { return; } this.notification = notification; // remove the notification in 2.5 seconds setTimeout(() => { this.notification = {}; }, 1250); // send IPC to frontend to make the notification if (this.mainWindow) { this.mainWindow.webContents.send(IPCKeys.Notification, this.notification); } }; clear = () => { this.notification = {}; }; } ================================================ FILE: app/tasks/managers/profile/profile.ts ================================================ import { BrowserWindow, ipcMain, IpcMainEvent } from 'electron'; import { Profiles, Profile } from './typings'; import { IPCKeys } from '../../../constants/ipc'; export class ProfileManager { mainWindow: BrowserWindow | null; profiles: Profiles; constructor(mainWindow: BrowserWindow | null) { this.mainWindow = mainWindow; this.profiles = {}; ipcMain.on(IPCKeys.AddProfiles, this.registerAll); ipcMain.on(IPCKeys.RemoveProfiles, this.deregisterAll); } /** * Registers a profile to the main process * @param id - profile id * @param profile - profile */ register = async (profile: Profile) => { if (!profile?.id) { return; } const { id } = profile; this.profiles[id] = profile; }; /** * Deregisters a previously registered profile from the main process * @param id - profile id */ deregister = async ({ id }: Profile) => { delete this.profiles[id]; }; /** * Retrieves a profile given an id * @param id - profile id */ retrieve = (id: string) => { return this.profiles[id]; }; /** * Registers a list or singular profile on the main process * @param proxies - Proxy/Proxies group(s) to register */ registerAll = (_: IpcMainEvent, profiles: Profile[] | Profile) => { if (Array.isArray(profiles)) { return Promise.all(profiles.map(profile => this.register(profile))); } return this.register(profiles); }; /** * Deregisters a previously loaded profile (or profiles) from the main process * @param profiles - profile(s) */ deregisterAll = (_: IpcMainEvent, profiles: Profile[] | Profile) => { if (Array.isArray(profiles)) { return Promise.all(profiles.map(profile => this.deregister(profile))); } return this.deregister(profiles); }; } ================================================ FILE: app/tasks/managers/profile/typings.d.ts ================================================ export type Profile = { id: string; name: string; matches: boolean; shipping: Location; billing: Location; payment: Payment; }; export type Location = { name: string; address: string; apt: string; city: string; province: { value: string; label: string; }; zip: string; country: { label: string; value: string; }; phone: string; email: string; }; export type Payment = { holder: string; card: string; exp: string; cvv: string; type: string; }; export type Profiles = { [id: string]: Profile; }; ================================================ FILE: app/tasks/managers/proxy.ts ================================================ import { BrowserWindow, ipcMain, IpcMainEvent } from 'electron'; import { RegisterProps, DeregisterProps, ReserveProps, SwapProps, ProxyGroup, Proxy } from './typings'; import { IPCKeys } from '../../constants/ipc'; import { format, Queue } from '../common/utils'; import { IS_DEV } from '../../constants/env'; type Proxies = { [key: string]: Queue; }; export class ProxyManager { mainWindow: BrowserWindow | null; proxies: Proxies; constructor(mainWindow: BrowserWindow | null) { this.mainWindow = mainWindow; this.proxies = {}; ipcMain.on(IPCKeys.AddProxies, this.registerAll); ipcMain.on(IPCKeys.RemoveProxies, this.deregisterAll); } /** * Registers a proxy group on the main process * @param id - proxy group id * @param proxies - list of proxies */ register = async ({ id, proxies }: RegisterProps) => { const queue = new Queue(); this.proxies[id] = queue; // prevent multiple logs happening over and over again let logged = false; return Promise.all( proxies.map((p: Proxy) => { if (!IS_DEV && /^127/.test(p.ip) && !logged) { logged = true; return null; } const proxy = format(p.ip); if (!proxy) { return null; } return queue.enqueue({ ...p, proxy }); }) ); }; /** * Deregisters a previously registered group from the main process * @param id - proxy group id */ deregister = async ({ id }: DeregisterProps) => { const group = this.proxies[id]; if (!group) { return; } delete this.proxies[id]; }; /** * * @param id - proxy group id * @param taskId - task id */ reserve = ({ id, taskId }: ReserveProps) => { const queue = this.proxies[id]; if (!queue) { return null; } const proxy = queue.dequeue(); // we're out of proxies, return null if (!proxy) { return null; } if (this.mainWindow) { this.mainWindow.webContents.send( IPCKeys.ProxyStatus, taskId, id, proxy.ip, true ); } // push the reserved proxy back to the end of the queue queue.enqueue(proxy); return proxy; }; swap = async ({ id, proxy, group }: SwapProps) => { const swapped = this.reserve({ id: group, taskId: id }); if (!swapped) { return null; } // send an event to the frontend to change inUse status of old proxy if (this.mainWindow && proxy) { this.mainWindow.webContents.send( IPCKeys.ProxyStatus, id, group, proxy.ip, false ); } return swapped; }; /** * Registers a list or singular proxy group object on the main process * @param proxies - Proxy/Proxies group(s) to register */ registerAll = (_: IpcMainEvent, proxies: ProxyGroup[] | ProxyGroup) => { if (Array.isArray(proxies)) { return Promise.all(proxies.map(p => this.register(p))); } return this.register(proxies); }; /** * Deregisters a previously loaded proxy group (or groups) from the main process * @param proxies - Proxy/Proxies group(s) to deregister */ deregisterAll = (_: IpcMainEvent, proxies: ProxyGroup[] | ProxyGroup) => { if (Array.isArray(proxies)) { return Promise.all(proxies.map(p => this.deregister(p))); } return this.deregister(proxies); }; } ================================================ FILE: app/tasks/managers/queue/index.ts ================================================ import { Cookie } from 'electron'; export class QueueManager { bank: { [url: string]: { id: string; cookies: Cookie[]; }[]; }; constructor() { this.bank = {}; } get = (url: string) => { if (!this.bank[url]) { return null; } const store = this.bank[url]; const cycled = store.shift(); if (!cycled) { return null; } this.bank[url].push({ ...cycled }); return cycled; }; add = ({ id, url, cookies }: any) => { if (!this.bank[url]) { this.bank[url] = []; } this.bank[url].push({ id, cookies }); }; remove = ({ id, url }: { id: string; url: string }) => { if (!this.bank[url]) { return; } const index = this.bank[url].findIndex(c => c.id === id); if (index === -1) { return; } this.bank[url].splice(index, 1); }; } ================================================ FILE: app/tasks/managers/restart.ts ================================================ import { BrowserWindow, ipcMain } from 'electron'; import { settingsStorage } from '../../utils/storageHelper'; import { IPCKeys } from '../../constants/ipc'; export class RestartManager { autoRestart: boolean; mainWindow: BrowserWindow | null; constructor(mainWindow: BrowserWindow | null) { this.autoRestart = settingsStorage.getItem('enableAutoRestart') || false; this.mainWindow = mainWindow; ipcMain.on(IPCKeys.ToggleAutoRestart, (_, value: boolean) => { this.autoRestart = value; }); } restart = () => this.autoRestart; } ================================================ FILE: app/tasks/managers/tasks/choose.ts ================================================ import { BrowserWindow, Session } from 'electron'; import { Task, Monitor, Platforms } from '../../common/constants'; import { Parse } from '../../shopify/utils'; // Shopify includes import { ShopifyMonitor, RateFetcher, chooseShopifyTask } from '../../shopify'; // YeezySupply includes import { chooseYeezySupplyTask } from '../../yeezysupply'; // Footsites includes import { chooseFootsiteTask } from '../../footsites'; // Pokemon includes import { choosePokemonTask } from '../../pokemon'; import { ShopifyContext, YeezySupplyContext, FootsiteContext, PokemonContext } from '../../common/contexts'; import { Proxy } from '../typings'; import { ProxyManager, CaptchaManager, WebhookManager, ProfileManager, NotificationManager, RestartManager, CheckoutManager, BrowserManager, GeetestManager, QueueManager, InterceptionManager, CheckpointManager } from '..'; import { AnalyticsManager } from '../analytics'; const { getParseType } = Parse; const { ParseType } = Monitor; const { Types } = Task; type CreateProps = { task: any; group: string; taskSession: Session; monitorSession: Session; proxy: Proxy; type: string; logger: any; // todo mainWindow: BrowserWindow | null; relayMessage: any; captchaManager: CaptchaManager; proxyManager: ProxyManager; webhookManager: WebhookManager; profileManager: ProfileManager; notificationManager: NotificationManager; restartManager: RestartManager; checkoutManager: CheckoutManager; analyticsManager: AnalyticsManager; browserManager: BrowserManager; geetestManager: GeetestManager; queueManager: QueueManager; checkpointManager: CheckpointManager; interceptionManager: InterceptionManager; }; export const createTask = ({ task, group, taskSession, monitorSession, proxy, type, logger, mainWindow, relayMessage, captchaManager, proxyManager, webhookManager, profileManager, notificationManager, restartManager, checkoutManager, analyticsManager, browserManager, geetestManager, queueManager, checkpointManager, interceptionManager }: CreateProps) => { let _task; let _monitor; const { platform, id } = task; switch (platform) { case Platforms.Shopify: { const parseType = getParseType(task.product); const context = new ShopifyContext({ id, task, group, type, parseType, taskSession, monitorSession, proxy, logger, relayMessage, captchaManager, proxyManager, webhookManager, profileManager, notificationManager, restartManager, checkoutManager, analyticsManager, checkpointManager }); if (type === Types.Normal) { _monitor = new ShopifyMonitor(context); const ShopifyTask = chooseShopifyTask(task.mode); _task = ShopifyTask(context); } else if (type === Types.Rates) { _task = new RateFetcher(context, mainWindow); } break; } case Platforms.YeezySupply: { const context = new YeezySupplyContext({ id, task, group, parseType: ParseType.Variant, taskSession, monitorSession, proxy, logger, relayMessage, captchaManager, proxyManager, webhookManager, profileManager, notificationManager, restartManager, checkoutManager, browserManager, analyticsManager, interceptionManager }); const YeezySupplyTask = chooseYeezySupplyTask(); _task = YeezySupplyTask(context); break; } case Platforms.Pokemon: { const context = new PokemonContext({ id, task, group, parseType: ParseType.Variant, taskSession, monitorSession, proxy, logger, relayMessage, captchaManager, proxyManager, webhookManager, profileManager, notificationManager, restartManager, checkoutManager, analyticsManager, geetestManager }); const PokemonTask = choosePokemonTask(); _task = PokemonTask(context); break; } case Platforms.Footsites: { const context = new FootsiteContext({ id, task, group, parseType: ParseType.Variant, taskSession, monitorSession, proxy, logger, relayMessage, captchaManager, proxyManager, webhookManager, profileManager, notificationManager, restartManager, checkoutManager, analyticsManager, queueManager }); const FootsiteTask = chooseFootsiteTask(); _task = FootsiteTask(context); break; } default: break; } return { _task, _monitor }; }; ================================================ FILE: app/tasks/managers/tasks/index.ts ================================================ /* eslint-disable no-restricted-syntax */ import { isEmpty } from 'lodash'; import { session, BrowserWindow, Session } from 'electron'; import { IPCKeys } from '../../../constants/ipc'; // Shared includes import { LoggerService, StaggeredQueue } from '../../common/utils'; import { CaptchaManager, ProxyManager, WebhookManager, ProfileManager, NotificationManager, RestartManager, CheckoutManager, BrowserManager, AnalyticsManager, CheckpointManager, GeetestManager, QueueManager, InterceptionManager } from '..'; import { Task } from '../../common/constants'; // Shopify includes import { Parse } from '../../shopify/utils'; import { Tasks, Monitors, Sessions, Intervals, Messages } from '../typings'; import { createTask } from './choose'; const { getParseType } = Parse; const { Types } = Task; export class TaskManager { logPath: string; mainWindow: BrowserWindow | null; startQueue: StaggeredQueue; startWorker: Worker | undefined; tasks: Tasks; monitors: Monitors; taskSessions: Sessions; monitorSessions: Sessions; messages: Messages; messageBatchDelay: number; messageIntervals: Intervals; proxyManager: ProxyManager; webhookManager: WebhookManager; captchaManager: CaptchaManager; profileManager: ProfileManager; notificationManager: NotificationManager; restartManager: RestartManager; checkoutManager: CheckoutManager; browserManager: BrowserManager; analyticsManager: AnalyticsManager; geetestManager: GeetestManager; checkpointManager: CheckpointManager; queueManager: QueueManager; ticketManager: any; interceptionManager: InterceptionManager; constructor(logPath: string, mainWindow: BrowserWindow | null) { // Logger file path this.logPath = logPath; this.mainWindow = mainWindow; // Tasks Map this.tasks = {}; // Monitors Map this.monitors = {}; // Sessions Map this.taskSessions = {}; this.monitorSessions = {}; this.messages = {}; this.messageIntervals = {}; this.messageBatchDelay = 150; // proxy related IPC this.proxyManager = new ProxyManager(mainWindow); // webhook related IPC this.webhookManager = new WebhookManager(); this.notificationManager = new NotificationManager(mainWindow); // captcha related IPC this.captchaManager = new CaptchaManager( mainWindow, this.notificationManager ); this.profileManager = new ProfileManager(mainWindow); this.restartManager = new RestartManager(mainWindow); this.checkoutManager = new CheckoutManager(); this.browserManager = new BrowserManager(); this.analyticsManager = new AnalyticsManager(); this.geetestManager = new GeetestManager(); this.queueManager = new QueueManager(); this.checkpointManager = new CheckpointManager(); this.startQueue = new StaggeredQueue(); this.interceptionManager = new InterceptionManager(); } process = ({ group, id }: any) => { if (this.mainWindow) { const task = this.tasks[group][id]; const monitor = this.monitors[group][id]; try { if (monitor) { monitor.run(); } task.run(); } catch (error) { this.stop({ id, group }); } } }; setupMessageInterval = async (group: string) => { if (!this.messages[group]) { this.messages[group] = {}; } if (!this.messageIntervals[group]) { try { this.messageIntervals[group] = setInterval(() => { if (!this.mainWindow?.webContents) { return; } if (isEmpty(this.messages[group])) { return; } this.mainWindow.webContents.send( IPCKeys.TaskStatus, group, this.messages[group] ); this.messages[group] = {}; }, this.messageBatchDelay); } catch (e) { // fail silently... } } }; stopMessageInterval = (group: string) => { // clear out messages before stopping... if (this.mainWindow && !isEmpty(this.messages[group])) { this.mainWindow.webContents.send( IPCKeys.TaskStatus, group, this.messages[group] ); this.messages[group] = {}; } if (this.messageIntervals[group]) { clearInterval(this.messageIntervals[group]); delete this.messageIntervals[group]; } }; stopMessageIntervals = async () => { return Promise.all( Object.keys(this.messageIntervals).map((group: any) => this.stopMessageInterval(group) ) ).catch(() => {}); }; /** * Callback for Task Events * * This method is registered as a callback for all running tasks. The method * is used to merge all task events into a single stream, so only one * event handler is needed to consume all task events. * * @param {String} id the id of the task/monitor that emitted the event * @param {String} message the status message * @param {Task.Event} event the type of event that was emitted */ mergeStatusUpdates = async ( group: string, taskIds: string[], message: any ) => { if (this.mainWindow) { Promise.all( // eslint-disable-next-line array-callback-return [...taskIds].map(id => { this.messages[group] = { ...this.messages[group], [id]: { ...this.messages[group][id], ...message } }; }) ).catch(() => {}); } }; /** * Changes a delay for a group of tasks * @param delay {Number} - numerical value to change the delay to * @param type {DelayType} - either a) monitor, or b) retry * @param tasks {List} - */ changeDelay = async ({ delay, type, group, tasks = [] }: { delay: number; type: string; group: string; tasks?: any[]; }) => { // exit early if we don't have any task groups or tasks in the group if (isEmpty(this.tasks) || isEmpty(this.tasks[group])) { return; } Promise.all( tasks.map((t: any) => { const task = this.tasks[group][t.id]; const monitor = this.monitors[group][t.id]; if (task) { task.context.task[type] = delay; if (task.delayer) { task.delayer.clear(); } } if (monitor) { monitor.context.task[type] = delay; if (monitor.delayer) { monitor.delayer.clear(); } } return t; }) ).catch(() => {}); }; /** * Start a task * * This method starts a given task if it has not already been started. The * requisite data is generated (id, open proxy if it is available, etc.) and * starts the task asynchronously. * * If the given task has already started, this method does nothing. * @param {Task} task * @param {object} options Options to customize the task: * - type - The task type to start */ start = async ({ group, task, type = Types.Normal }: { group: string; task: any; type?: string; }) => { const { id, proxies } = task; this.startQueue.removeJob(group, id); if (!this.tasks[group]) { this.tasks[group] = {}; } if (!this.monitors[group]) { this.monitors[group] = {}; } setTimeout(async () => { let proxy: any = null; if (proxies) { proxy = this.proxyManager.reserve({ id: proxies.id, taskId: id }); } const taskSession: Session = session.fromPartition(`${id}-task`, { cache: false }); await taskSession.closeAllConnections(); const monitorSession: Session = session.fromPartition(`${id}-monitor`, { cache: false }); await monitorSession.closeAllConnections(); this.taskSessions[id] = taskSession; this.monitorSessions[id] = monitorSession; await taskSession.clearAuthCache(); await monitorSession.clearAuthCache(); await taskSession.clearStorageData(); await monitorSession.clearStorageData(); await taskSession.clearCache(); await monitorSession.clearCache(); await taskSession.clearHostResolverCache(); await monitorSession.clearHostResolverCache(); if (proxy?.ip) { const [ip, port] = proxy.ip.split(':'); await taskSession.setProxy({ mode: 'fixed_servers', proxyRules: `http=${ip}:${port};https=${ip}:${port};` }); await monitorSession.setProxy({ mode: 'fixed_servers', proxyRules: `http=${ip}:${port};https=${ip}:${port};` }); } else { await taskSession.setProxy({ mode: 'fixed_servers', proxyRules: '' }); await monitorSession.setProxy({ mode: 'fixed_servers', proxyRules: '' }); } await taskSession.forceReloadProxyConfig(); await monitorSession.forceReloadProxyConfig(); setTimeout(() => { const { _task, _monitor } = createTask({ task, group, taskSession, monitorSession, proxy, type, logger: LoggerService, mainWindow: this.mainWindow, relayMessage: this.mergeStatusUpdates, captchaManager: this.captchaManager, proxyManager: this.proxyManager, webhookManager: this.webhookManager, profileManager: this.profileManager, notificationManager: this.notificationManager, restartManager: this.restartManager, checkoutManager: this.checkoutManager, analyticsManager: this.analyticsManager, browserManager: this.browserManager, geetestManager: this.geetestManager, queueManager: this.queueManager, checkpointManager: this.checkpointManager, interceptionManager: this.interceptionManager }); if (!_task) { return; } if (_monitor) { this.monitors[group][id] = _monitor; } this.tasks[group][id] = _task; this.setupMessageInterval(group); return this.startQueue.add(group, id, this.process); }, 500); }, 0); }; /** * Start multiple tasks * * This method is a convenience method to start multiple tasks * with a single call. The `start()` method is called for all * tasks in the given list. * * @param {List